DI ĐỘNG VÀ PHƯƠNG PHÁP PHÁT TRIỂN LINH HOẠT
2.2. Kỹ thuật phân tích và tái cấu trúc mã nguồn để nâng cao hiệu năng của ứng dụng d
2.2.3.3. Đa luồng và đồng bộ hóa
Tốc độ và hiệu quả của các tiến trình thực thi trong một thời gian dài, hoạt động dữ liệu chuyên sâu sẽ được cải thiện khi chia nó thành các tiến trình thực thi nhỏ chạy song song. Trên các thiết bị có nhiều CPU, hoặc CPU đa nhân hay CPU hỗ trợ siêu phân luồng, các luồng sẽ thực sự hoạt động song song tại cùng một thời điểm. Như vậy, nếu các luồng này cùng truy xuất đến một biến dữ liệu hoặc một phương thức điều này có thể gây đến việc sai lệch dữ liệu. Việc sắp xếp thứ tự các luồng truy xuất đối tượng thật sự rất cần thiết, đồng bộ hóa chính là việc sắp xếp thứ tự các luồng khi
truy xuất vào đối tượng giúp cải thiện cũng như tối ưu hóa hiệu năng của chương trình.
Để tự động chạy các tác vụ sẵn có, hoặc cho phép nhiều tác vụ chạy cùng một lúc cần phải cung cấp bộ quản lý luồng. ThreadPoolExecutor sẽ được sử dụng để chạy các tác vụ từ hàng đợi. Kèm theo đó các biến có thể được truy cập bởi nhiều luồng trong khối đồng bộ. Khi hai hay nhiều hơn một luồng (thread) muốn truy cập vào tài nguyên được chia sẻ chúng cần một cách thức để đảm bảo rằng nguồn tài nguyên sẽ được sử dụng duy nhất bởi một luồng tại một thời điểm gọi là đồng bộ hóa (Synchronization). Nếu một luồng cập nhật đối tượng được chia sẻ và một luồng khác cũng cố gắng cập nhật đối tượng đó thì hành động cập nhật đối tượng đó khơng được rõ ràng dẫn đến chương trình đưa ra các kết quả khơng thực sự chính xác. Cách thực thi đồng bộ là sử dụng các giám sát đối tượng (object’s monitor) trong Java. Mỗi đối tượng sẽ có một giám sát đối tượng và một monitor lock (intrinsic lock). Đối tượng giám sát đảm bảo rằng monitor lock của đối tượng của nó được nắm giữ bởi một luồng duy nhất tại mỗi thời điểm. Do đó các monitor lock được sử dụng để ngăn chặn việc nhiều luồng cùng nắm giữ nó. Nếu một thao tác u cầu luồng thực thi nắm giữ một khóa thì luồng đó phải nắm giữ được khóa trước khi bắt đầu thực thi. Nếu các luồng khác cố gắng thực hiện một thao tác u cầu khóa thì sẽ bị khóa cho đến khi luồng đầu tiên giải phóng [43].