2013-06-19 27 views
13
class Bob { 
    private static final Object locke = new Object(); 
    private static volatile int value; 

    public static void fun(){ 
    synchronized(locke){ 
     value++; 
    } 
    }  
} 

Làm thế nào này khác gì so đồng bộ hóa trên lớp, ví dụ: synchronized(Bob.class){...}Tại sao phải đồng bộ hóa trên một thành viên khóa tĩnh thay vì trên một lớp học?

+1

lưu ý Không liên quan: cho sử dụng cụ thể này một 'AtomicInteger' sự là giải pháp đơn giản hơn ;-) –

+0

hoàn toàn đồng ý .. –

Trả lời

19

Một số khác mã có thể phá vỡ của bạn bằng cách thực hiện một synchronized(Bob.class). Nếu có, mã của bạn đột nhiên cạnh tranh với mã số mã số của họ để khóa, có thể làm hỏng mã của bạn.

Nguy hiểm đó bị xóa nếu đối tượng lock không thể truy cập được từ bên ngoài đối tượng cần.

+0

bởi 'phá vỡ' bạn có nghĩa là bế tắc, phải không? Không phải là nó tạo ra một số hành vi không xác định điên, như trong đất C++. Nếu thread A khóa trên lớp 'Bob' thì thread B sẽ không thể sử dụng' fun() ', thats it? –

+3

@BinaryBob Nó có thể bế tắc hoặc một số mã không liên quan có thể chỉ đơn giản là giữ khóa trong một thời gian dài, ngăn cản lớp học của bạn làm cho tiến bộ tức là gây ra một [vấn đề liveness] (http://docs.oracle.com/javase/tutorial/essential/ concurrency/liveness.html). – assylias

+0

Ok, xóa ngay bây giờ .. –

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