2012-07-13 10 views
5

Hãy xem xét đoạn mã sau, tôi muốn làm cho nó một sợi lớp an toàn, do đó nó sẽ không bao giờ có được số lẻ:Tôi có thể sử dụng đồng bộ hóa với trường cuối cùng không?

class Test { 
    private int value = 0; 
    private final Object lock; 

    public void add() { 
    synchronized (lock) { 
     value++; 
     value++; 
    } 
    } 

    public int getValue() { 
    synchronized (lock) { 
     return value; 
    } 
    } 
} 

Tôi bây giờ nghi ngờ của trường khóa, được tuyên bố là cuối cùng, sẽ này vấn đề? hoặc nó sẽ phá vỡ an toàn chủ đề?

Tôi nghĩ rằng nếu trường khóa không được khai báo là cuối cùng, đây phải là lớp an toàn cho luồng. Nếu kết luận này là sai, xin vui lòng sửa tôi, cảm ơn bạn.

+0

Xem câu hỏi [this] (http://stackoverflow.com/questions/2101327/final-variable-and-synchronized-block-in-java). – Lion

Trả lời

9

Tôi bây giờ nghi ngờ về trường khóa, được khai báo là cuối cùng, vấn đề này có phải không?

Vâng, coi thực tiễn hết sức mình để chỉ khóa final đối tượng lĩnh vực.

Nếu bạn có thể thay đổi tham chiếu, bạn có thể thay đổi đối tượng nào bị khóa, phá vỡ an toàn luồng.

0

Trong Java, quá trình đồng bộ hóa được thực hiện bởi một số trường ẩn của đối tượng khóa. Ngoài ra có nghĩa là cuối cùng, rằng REFERENCE là cuối cùng, không phải là đối tượng chính nó.

Ví dụ:

final Bar bar = new Bar(); //bar hase property lock 
bar.lock = XYZ; //will work, object is not FINAL 
bar = new Bar(); //fail, the reference is FINAL 
+0

Đối với những gì nó có giá trị, không có xây dựng trong xây dựng để làm cho 'đối tượng cuối cùng' trong Java. Tính không thay đổi phải được thực thi theo chương trình. – corsiKa

1

nên được ok. thậm chí có thể làm cho nó an toàn hơn, vì người ta không thể chỉ định cái gì đó khác cho khóa trong khi thực hiện.

1

Nếu bạn đang tìm kiếm để khóa một thể hiện, sau đó cuối cùng là chấp nhận được. Nếu bạn nhìn vào khóa hoặc đặt một mutex trên một lớp, sau đó làm cho biến tĩnh.

0

Khi bạn đang cố gắng đồng bộ hóa nhiều chuỗi, chúng phải được đồng bộ hóa dựa trên cùng một đối tượng/tham chiếu đối tượng. Điều này đảm bảo rằng cả hai đều đồng bộ hóa cùng một lúc dựa trên cùng một dữ liệu.

Hy vọng rằng sẽ có một chút ý nghĩa; bạn chỉ cần đồng bộ hóa dựa trên biến được hoàn tất chứ không phải biến số động.

Nếu một phương pháp làm thay đổi một lĩnh vực tĩnh, bạn phải đồng bộ hóa quyền truy cập vào lĩnh vực này, ngay cả khi phương pháp này thường chỉ được sử dụng bởi một chủ đề duy nhất. Khách hàng không thể thực hiện đồng bộ hóa bên ngoài trên phương thức như vậy vì có thể không có bảo đảm rằng các khách hàng không liên quan cũng sẽ làm như vậy, see.

Các vấn đề liên quan