2012-04-12 39 views
9

Có lý do nào để sử dụng dễ bay hơi và đồng bộ hóa với nhau trong mã này không?Dễ bay hơi khi được đồng bộ hóa với nhau

public class Helper { 
    private volatile int n; 
    private final Object lock = new Object(); 
    public Helper(int n) { 
    this.n = n; 
    } 

    public void setN(int value) { 
    synchronized (lock) { 
     n = value; 
    } 
    } 
} 

Trình trợ giúp lớp phải là chủ đề an toàn. Tôi đã có ví dụ này từ sách "Hướng dẫn đồng thời Java", nhưng vẫn chưa rõ: lý do sử dụng biến động và đồng bộ hóa với nhau trong ví dụ này là gì?

+1

Cuốn sách chính xác mà bạn nói đến là gì? Tôi sẽ mạnh mẽ tư vấn cho cuốn sách Java Concurrency in Practice (http://jcip.net/) để học Java concurrency. –

+0

Tôi đã tìm thấy cuốn sách này ở đây (Trang 167) http://www.sei.cmu.edu/reports/10tr015.pdf Mọi thứ trong cuốn sách này khá rõ ràng ngoại trừ trường hợp này chỉ –

+0

Sử dụng AtomicInteger. – khachik

Trả lời

7

Mục đích của ví dụ này là để chỉ ra rằng syncronized mà không volatile là không đủ trong trường hợp này được thực tế là đối tượng có thể được công bố mất an toàn (tức là không volatile trong Foo):

Nếu helper trường trong lớp Foo không được khai báo dễ bay hơi, trường n phải được khai báo dễ bay hơi sao cho mối quan hệ xảy ra trước đó được thiết lập giữa khởi tạo của n và ghi của trình trợ giúp cho trường trợ giúp. Điều này phù hợp với hướng dẫn “VNA06-J. Đừng cho rằng việc khai báo một đối tượng dễ bay hơi đảm bảo khả năng hiển thị của các thành viên của nó ”ở trang 35. Điều này chỉ được yêu cầu khi người gọi (lớp Foo) không thể tin cậy để khai báo helper dễ bay hơi.

Đúng vậy, nhưng họ đã chọn một ví dụ không tốt để chứng minh điều đó, bởi vì volatile mà không đồng bộ hóa là đủ trong trường hợp này.

0

Tôi đoán rằng biến động được sử dụng vì 'n' được đặt trong hàm tạo

+0

Có, nhưng lý do nào để sử dụng đồng bộ trong phương thức setN? –

+0

Oh thực sự? Tôi không biết làm thế nào để gọi constructor của cùng một đối tượng từ 2 hoặc nhiều chủ đề, phải không? – hsestupin

+0

Tôi cũng không biết) Câu hỏi của tôi là về lý do đồng bộ hóa cần thiết trong phương thức setN. Nếu n biến là dễ bay hơi, setter có thể không có bất kỳ đồng bộ hóa bổ sung nào. Hay không? –

1

Không cần đặt khối đồng bộ xung quanh thay đổi về giá trị; vì Java 5 được thực hiện "tự động" cho các biến dễ bay hơi. Tôi nghĩ rằng trước đó với Java 5, nó không nhất thiết phải là trường hợp.

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