2011-10-19 9 views
36

Cách thích hợp/ưa thích để chú thích các trường được bảo vệ bằng ReadWriteLock để các công cụ như FindBugs có thể tận dụng chú thích đó là gì? Tên của ReadWriteLock chỉ cần được viết trong chú thích @GuardedBy. Có bao giờ một lý do để viết tên của khóa chỉ đọc, hoặc chỉ là khóa viết, trong chú thích @GuardedBy? FindBugs hoặc các công cụ khác, thậm chí có hỗ trợ ReadWriteLock trong @GuardedBy không?@GuardedBy chú thích với java.util.concurrent.locks.ReadWriteLock

Trả lời

28

Tại thời điểm viết bài này, @GuardedByisn't fully implemented by Findbugs, và chủ yếu là chỉ cho tài liệu. (Đó là một phần được triển khai.)

Tôi luôn sử dụng @GuardedBy("readwritelock") hoặc đối tượng mà tôi sử dụng để synchronize.

Đối với ví dụ về sau:

class Example { 
    private Object lock = new Object(); 

    @GuardedBy("lock") 
    private Stuff innards = ...; 

    public void work() { 
     synchronized(lock) { 
      workWith(innards.goop()); 
     } 
    }   
} 
+2

Cảm ơn! Chỉ cần một lưu ý nhanh, tôi không biết trạng thái của nghệ thuật FindBugs (do đó tôi đã hỏi câu hỏi này! :), nhưng liên kết đề cập đến rằng chú thích có thể không được triển khai có vẻ như là bốn tuổi. –

+0

Dự án đó rất tích cực, được đánh giá bởi hoạt động trên trình theo dõi lỗi được liên kết. –

+0

Bạn có nghĩa là dự án FindBugs? Oh chắc chắn, nó còn sống và tốt. Tôi có nghĩa là tuyên bố cụ thể từ bốn năm trước rằng chú thích GuardedBy có thể không được thực hiện. Tôi đang nói rằng mã FindBugs gần đây nhất có thể triển khai nó. Xin lỗi nếu tôi hiểu sai/hiểu lầm điều gì đó. –

2

Tìm lỗi hỗ trợ các chú thích như sau:

net.jcip.annotations.GuardedBy 
net.jcip.annotations.Immutable 
net.jcip.annotations.NotThreadSafe 
net.jcip.annotations.ThreadSafe 

Sử dụng những GuardedBy chú thích nên thực hiện như sau:

@ThreadSafe 
public class Queue<E> implements java.util.Queue<E> 
{ 
    private ConcurrentLinkedQueue readWriteLock; 

    @GuardedBy(value="readWriteLock") 
    public boolean offer(E o) 
    { 
     return queue.offer(o); 
    } 

} 
+0

Những chú thích này cũng được chụp trong JSR305. Chúng có thể được thấy trong triển khai tham chiếu này: http://code.google.com/p/jsr-305/source/browse/trunk/ri/src/main/java/javax/annotation/concurrent/ –

+3

Tên của khóa có thể được viết gọn hơn như thế này: @GuardedBy ("readWriteLock") - phần "value =" không được yêu cầu một cách rõ ràng. –

+1

Câu hỏi của tôi không thực sự về mức sử dụng cơ bản. Tôi đang cố gắng tìm hiểu xem một java.util.concurrent.locks.ReadWriteLock, trong đó có cả một khóa đọc và một khóa ghi nên được gọi trong một chú thích @GuardedBy như toàn bộ ReadWriteLock, hoặc bởi cá nhân đọc và ghi khóa. Và liệu điều này có hiệu quả hay không. –