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

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

方法は、これはいくつかコードがsynchronized(Bob.class)を行うことによって、あなたを破ることができる、すなわちsynchronized(Bob.class){...}クラスではなく静的なロックメンバーで同期するのはなぜですか?

+1

関連したメモ:この特定の用途では、「AtomicInteger」は簡単な解決策です;-) –

+0

は完全に一致します。 –

答えて

19

、クラス上の同期は異なっています。もしそうなら、あなたのコードはと突然競合し、のコードがロックされ、コードが壊れている可能性があります。

lockオブジェクトがそれを必要とするオブジェクトの外部からアクセスできない場合、その危険は取り除かれます。

+0

'break'はデッドロックを意味します。 C++土地のように、未定義のクレイジーな振る舞いを生み出すわけではありません。スレッドAが 'Bob'クラスをロックすると、スレッドBは' fun() 'を使用できなくなります。 –

+3

@BinaryBobデッドロックや関連性のないコードでは、長時間ロックを保持してクラスが進行しないなどの問題が発生する可能性があります(http://docs.oracle.com/javase/tutorial/essential/)。 concurrency/liveness.html)。 – assylias

+0

OK、clear now .. –

関連する問題