Зачем синхронизировать элемент статической блокировки, а не класс?

class Bob {
  private static final Object locke = new Object();
  private static volatile int value;

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

Как это отличается от синхронизации в классе, т.е. synchronized(Bob.class){...}

Ответы

Ответ 1

Другой код может сломать ваш, выполнив synchronized(Bob.class). Если они это сделают, ваш код вдруг соревнуется со своим кодом для блокировки, возможно, нарушив ваш код.

Эта опасность удаляется, если объект lock недоступен из-за объекта, который ему нужен.