5

Sau đây là người đọc và nhà văn mẫu điển hình (rất nhiều lần đọc và vài viết)Java: ReentrantReadWriteLock với ưu tiên

private ReadWriteLock lock = new ReentrantReadWriteLock(); 
    private int value; 

    public void writeValue(int newValue){ 
     lock.writeLock().lock(); 
     try{ 
      this.value = newValue; 
     } 
     finally{ 
      lock.writeLock().unlock(); 
     } 
    } 

    public int readValue(){ 
     lock.readLock().lock(); 
     try{ 
      return value; 
     } 
     finally{ 
      lock.writeLock().unlock(); 
     } 
    } 

tôi tự hỏi rằng là nó có thể được ưu tiên để viết và người đọc? Ví dụ, người viết bình thường có thể chờ đợi một thời gian rất dài (có thể mãi mãi) nếu có các khóa đọc liên tục được giữ bởi chủ đề khác, vì vậy có thể có nhà văn có mức độ ưu tiên cao hơn, vì vậy bất cứ khi nào một nhà văn đến, nó có thể được coi là ưu tiên cao (bỏ qua dòng) một cái gì đó như thế.

Trả lời

4

Theo số javadoc, việc triển khai jdk thực hiện không có bất kỳ ưu tiên người đọc/người viết nào. tuy nhiên, nếu bạn sử dụng triển khai "công bằng", thì khóa được cấp theo thứ tự năm mươi (vẫn không có tùy chọn người đọc/nhà văn), vì vậy ít nhất người đọc trong tương lai sẽ không chặn nhà văn đang chờ.

+0

Bạn có nghĩ rằng việc thu thập đồng thời bổ sung khác là cần thiết vào thời điểm này không? như BlockingQueue? hoặc đồng thời PriortyQueue một cái gì đó như thế? – peter

+0

@ user1389813 - là nămo đặt hàng không phải là một đảm bảo đủ mạnh cho nhu cầu của bạn? xem xét rằng các độc giả (trong ví dụ của bạn) chỉ đọc một giá trị đơn giản, tôi không thể tưởng tượng rằng một nhà văn sẽ bị chặn tất cả những gì chờ đợi lâu cho độc giả hiện tại (có thể tiến hành đồng thời). – jtahlborn

+0

vì vậy đề xuất của bạn là gì? – peter

0

Ghi ổ khóa thực sự đã được ưu tiên trên khóa trình đọc.

Nếu một chủ đề muốn đọc tài nguyên, nó không quan trọng miễn là không có chủ đề nào được viết cho nó và không có chủ đề nào yêu cầu quyền ghi vào tài nguyên. Bằng cách ưu tiên các yêu cầu ghi truy cập, chúng tôi giả định rằng các yêu cầu viết quan trọng hơn các yêu cầu đọc.

vui lòng tham khảo this excellent post để biết thêm chi tiết.

Chỉnh sửa: điều quan trọng cần lưu ý là điều này giữ cho số fair mode only. cảm ơn @jtahlborn!

+1

theo [javadoc] (http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html): "Lớp này không áp đặt người đọc hoặc tùy chọn nhà văn ưu tiên cho khóa truy cập ". bài viết bạn đã liên kết là một triển khai riêng biệt. – jtahlborn

+0

@jtahlborn vui lòng đọc: "Chủ đề cố gắng lấy khóa đọc công bằng (không reentrantly) sẽ chặn nếu khóa ghi được giữ hoặc có chuỗi ghi đang chờ". – Vitaliy

+1

có, đối với phiên bản _fair_, và đó không phải là ưu tiên _writer_. xin vui lòng xem câu trả lời của tôi. – jtahlborn