Một ReentrantLock là không có cấu trúc , không giống như synchronized
cấ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 synchronized
cấu trúc.
Bên cạnh đó, ReentrantLock
hỗ trợ bỏ phiếu khóa và khóa gián đoạn chờ hỗ trợ hết thời gian . ReentrantLock
cũ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óttryLock
phươ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 ReentrantLock
s? 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 synchronized
khô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. ReentrantLock
cũ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 synchronized
khố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.