Vì vậy, tôi có mã tương tự như sauLàm thế nào để có được nhiều khóa mà không đặt hàng các ràng buộc trong Java?
synchronized(objectOne){ do stuff }
synchronized(objectTwo){ do stuff }
Vấn đề ở đây là chương trình sẽ chờ cho khóa trên , ngay cả khi khóa cho objectTwo
có sẵn. Những gì tôi đang cố gắng làm là nói: cố gắng khóa cả hai và objectTwo
và bất cứ lần nào bạn khóa trước tiên đều làm công cụ cho khóa đó. Tôi đã đưa ra một giải pháp nhưng tôi nghĩ rằng nó khá hacky và tôi tự hỏi nếu có ai có bất kỳ ý tưởng tốt hơn.
Đây là ý tưởng của tôi: Bắt đầu 2 chủ đề, mỗi chủ đề chờ một khóa và sau đó chuỗi chính sẽ đợi trên CountDownLatch. Vì vậy, bạn kết thúc với một cái gì đó như thế này:
CountDownLatch latch = new CountDownLatch(2);
new Thread(new Runnable(){
public void run(){
synchronized(objectOne) { do stuff }
latch.countDown();
}).start();
new Thread(new Runnable(){
public void run(){
synchronized(objectTwo) { do stuff }
latch.countDown();
}).start();
latch.await();
Điều đó nghe giống như cách tiếp cận hợp lý với tôi. – ArtB
Tôi không thể nói bằng mã được đăng, nhưng theo kinh nghiệm của tôi, một lớp khóa trên hai đối tượng khác nhau hầu như luôn luôn được chia thành hai lớp, với khóa được đóng gói ** bên trong ** hai lớp, không phải bởi lớp tổng hợp chúng – Nate
bạn đang sử dụng hai khóa khác nhau sao cho luồng B có thể không thấy sự thay đổi bộ nhớ của luồng A, tôi nghi ngờ sẽ không xảy ra - trước đây. –