Một ReentrantLock là không có cấu trúc , không giống như synchronizedcấu trúc - tức là bạn không cần phải sử dụng một cấu trúc khối cho khóa và thậm chí có thể tổ chức một khóa trên phương pháp. Một ví dụ:
private ReentrantLock lock;
public void foo() {
...
lock.lock();
...
}
public void bar() {
...
lock.unlock();
...
}
Dòng chảy như vậy là không thể biểu diễn thông qua một màn hình duy nhất trong một synchronizedcấu trúc.
Bên cạnh đó, ReentrantLockhỗ trợ bỏ phiếu khóa và khóa gián đoạn chờ hỗ trợ hết thời gian . ReentrantLockcũng có hỗ trợ cho chính sách công bằng cấu hình , cho phép lập lịch trình linh hoạt hơn.
Hàm tạo cho lớp này chấp nhận một tham số công bằng tùy chọn . Khi được đặt true, dưới sự tranh chấp, các khóa sẽ ưu tiên cấp quyền truy cập cho chuỗi chờ đợi lâu nhất. Nếu không, khóa này không đảm bảo bất kỳ thứ tự truy cập cụ thể. Các chương trình sử dụng khóa công bằng được truy cập bởi nhiều luồng có thể hiển thị thông lượng tổng thể thấp hơn (nghĩa là chậm hơn, thường chậm hơn nhiều) so với các chương trình sử dụng cài đặt mặc định, nhưng có thời gian nhỏ hơn để có được khóa và đảm bảo thiếu đói. Tuy nhiên, lưu ý rằng tính công bằng của khóa không đảm bảo tính công bằng của lập lịch luồng. Do đó, một trong nhiều luồng sử dụng khóa công bằng có thể có được nó nhiều lần liên tiếp trong khi các luồng hoạt động khác không tiến triển và hiện không giữ khóa. Cũng lưu ý rằng không sơn lóttryLockphương pháp không tôn vinh các thiết lập công bằng. Nó sẽ thành công nếu khóa có sẵn ngay cả khi các luồng khác đang chờ.
ReentrantLock cũng có thể có khả năng mở rộng hơn , hoạt động tốt hơn nhiều trong sự tranh chấp cao hơn. Bạn có thể đọc thêm về điều này ở đây .
Yêu cầu này đã được tranh luận, tuy nhiên; xem bình luận sau:
Trong thử nghiệm khóa reentrant, một khóa mới được tạo ra mỗi lần, do đó không có khóa độc quyền và dữ liệu kết quả là không hợp lệ. Ngoài ra, liên kết IBM không cung cấp mã nguồn cho điểm chuẩn cơ bản để không thể xác định liệu thử nghiệm có được tiến hành chính xác hay không.
Khi nào bạn nên sử dụng ReentrantLocks? Theo bài viết trên ...
Câu trả lời khá đơn giản - sử dụng nó khi bạn thực sự cần thứ gì đó mà nó cung cấp synchronizedkhông như chờ đợi khóa thời gian, chờ khóa gián đoạn, khóa không có cấu trúc khối, nhiều biến điều kiện hoặc bỏ phiếu khóa. ReentrantLockcũng có lợi ích về khả năng mở rộng và bạn nên sử dụng nó nếu bạn thực sự có một tình huống thể hiện sự tranh chấp cao, nhưng hãy nhớ rằng phần lớn các synchronizedkhối hầu như không bao giờ thể hiện bất kỳ sự tranh chấp nào, chứ đừng nói là tranh chấp cao. Tôi sẽ khuyên bạn nên phát triển với đồng bộ hóa cho đến khi đồng bộ hóa được chứng minh là không đầy đủ, thay vì chỉ đơn giản là giả sử "hiệu suất sẽ tốt hơn" nếu bạn sử dụngReentrantLock. Hãy nhớ rằng, đây là những công cụ nâng cao cho người dùng nâng cao. (Và người dùng thực sự tiên tiến có xu hướng thích các công cụ đơn giản nhất họ có thể tìm thấy cho đến khi họ tin rằng các công cụ đơn giản là không đủ.) Như mọi khi, hãy làm cho đúng trước, sau đó lo lắng về việc bạn có phải làm cho nó nhanh hơn hay không.