Tóm tắt ngắn gọn:
Semaphore và CountDownLatch phục vụ các mục đích khác nhau.
Sử dụng Semaphore để kiểm soát luồng truy cập tài nguyên.
Sử dụng CountDownLatch để đợi hoàn thành tất cả các chuỗi
Định nghĩa Semaphore từ javadocs:
Một Semaphore duy trì một bộ giấy phép. Mỗi khối lệnh get () nếu cần thiết cho đến khi có giấy phép và sau đó lấy nó. Mỗi bản phát hành () thêm một giấy phép, có khả năng phát hành một trình thu thập chặn.
Tuy nhiên, không có đối tượng giấy phép thực tế nào được sử dụng; các Semaphore chỉ giữ một đếm số có sẵn và hoạt động cho phù hợp.
Làm thế nào nó hoạt động ?
Cột được sử dụng để kiểm soát số lượng đề đồng thời đang sử dụng một nguồn lực resource.That có thể là cái gì đó giống như một dữ liệu chia sẻ, hoặc một khối mã ( phần quan trọng ) hoặc bất kỳ tập tin.
Số lượng trên Semaphore có thể lên xuống khi các luồng khác nhau gọi acquire
() và release
(). Nhưng tại bất kỳ thời điểm nào, bạn không thể có số lượng chủ đề lớn hơn số lượng Semaphore.
Các trường hợp sử dụng Semaphore:
- Hạn chế quyền truy cập đồng thời vào đĩa (điều này có thể làm giảm hiệu suất do tìm kiếm đĩa cạnh tranh)
- Giới hạn tạo luồng
- Tổng hợp / giới hạn kết nối JDBC
- Điều chỉnh kết nối mạng
- Điều chỉnh CPU hoặc các tác vụ chuyên sâu về bộ nhớ
Hãy xem bài viết này để biết cách sử dụng semaphore.
Định nghĩa CountDownLatch từ javadocs:
Hỗ trợ đồng bộ hóa cho phép một hoặc nhiều luồng đợi cho đến khi một tập hợp các thao tác được thực hiện trong các luồng khác hoàn tất.
Làm thế nào nó hoạt động?
CountDownLatch hoạt động bằng cách khởi tạo bộ đếm với số luồng, số lượng này sẽ giảm đi mỗi khi một luồng hoàn thành việc thực thi. Khi số đếm về 0, điều đó có nghĩa là tất cả các luồng đã hoàn thành quá trình thực thi của chúng và luồng chờ trên chốt sẽ tiếp tục thực thi.
CountDownLatch Các trường hợp sử dụng:
- Đạt được song song tối đa: Đôi khi chúng ta muốn bắt đầu một số luồng cùng một lúc để đạt được song song tối đa
- Chờ N chuỗi hoàn thành trước khi bắt đầu thực thi
- Phát hiện bế tắc.
Hãy xem bài viết này để hiểu rõ khái niệm CountDownLatch.
Hãy xem Fork Join Pool tại bài viết này . Nó có một số điểm tương đồng với CountDownLatch .