2012-02-06 40 views
7

Nói rằng tôi có đoạn mã sau:Khóa thực tế có quan trọng khi quyết định sử dụng dễ bay hơi không?

private Integer number; 
private final Object numberLock = new Object(); 

public int get(){ 
    synchronized(number or numberLock){ 
     return Integer.valueOf(number); 
    } 
} 

Câu hỏi của tôi là, làm các phiên bản sau của phương pháp add cần phải có number như biến động trong các trường hợp dưới đây:

public void add(int num){ 
    synchronized(number) 
     number = number + num; 
} 

public void add(int num){ 
    synchronized(numberLock) 
     number = number + num; 
} 

Tôi hiểu rằng đây là cả hai hoạt động nguyên tử, nhưng câu hỏi của tôi là, là giá trị của numberguarennteed để được đẩy ra ngoài bộ nhớ toàn cầu và hiển thị cho tất cả các chủ đề mà không sử dụng dễ bay hơi?

+0

Đồng bộ hóa trên số có thể không phải là một ý tưởng hay, các đối tượng số nguyên (có thể) được lưu vào bộ nhớ cache và vì vậy điều này sẽ chặn mã khác đồng bộ hóa trên cùng một số. – Jim

+0

@Jim đúng, chỉ là cố gắng để làm cho một ví dụ đơn giản:) – Shawn

Trả lời

10

là giá trị số guarennteed được đẩy ra ngoài bộ nhớ chung và hiển thị cho tất cả các chuỗi mà không sử dụng dễ bay hơi?

Có. đồng bộ cũng cung cấp khả năng hiển thị. Trên thực tế đồng bộ hóa cung cấp khả năng hiển thị và nguyên tử, trong khi chỉ có khả năng hiển thị dễ bay hơi.

+0

Vâng đặt, cảm ơn bạn – Shawn

+3

+1: 'đồng bộ' có thể làm cho 'bay hơi' dư thừa, nhưng không phải là cách khác xung quanh. –

+1

@Eugene: erf, ngày chậm cho tôi ở đây nhưng ... Chờ một giây: Tôi thấy không * đồng bộ * trong phương thức * get *. OP sẽ cần đồng bộ hóa cả * get * và * add * nếu không nó sẽ không hoạt động. AFAICT (nhưng đó là một ngày chậm chạp đối với tôi) không có khả năng hiển thị cũng không phải nguyên tử trong ví dụ của OP thấy rằng * get * đang sử dụng không có cơ chế đồng bộ hóa nào cả ... – TacticalCoder

1

Bạn chưa đồng bộ có được do đó, mã của bạn không phải là thread-safe:

public int get(){ 
    return Integer.valueOf(number); 
} 

Bên cạnh đó, đồng bộ hóa sẽ đảm bảo tầm nhìn như Eugene đã lưu ý.

+0

bắt tốt - thêm – Shawn

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