синхронизировать доступ к статическому полю - PullRequest
6 голосов
/ 05 сентября 2011

в пункте 67 «Эффективной Java» Джоша Блоха, он упомянул, что если метод изменяет статическое поле, вы должны синхронизировать доступ к этому полю, поскольку клиенты не могут выполнить внешнюю синхронизацию с таким методом. Я не совсем понимаю, почему клиент не может выполнить внешнюю синхронизацию статическим методом?

реализация внутренней синхронизации:

public class Serial {
  private static int serialNumber = 0;

  public synchronized static void incSerial() {  
      serialNumber++;
  }

}

если внутренняя синхронизация не реализована, клиент может выполнить внешнюю синхронизацию:

synchronize(Serial.class) {

  Serial.incSerial();
}

есть идеи?

Ответы [ 2 ]

6 голосов
/ 05 сентября 2011

Клиент может сделать это, но вы не можете принудительно выполнить такую ​​синхронизацию.Так что какой-то клиент может сделать несинхронизированный доступ и сломать все.

0 голосов
/ 09 сентября 2011

Вам необходимо убедиться, что вы используете блокировку, связанную с классом, который содержит статическую переменную экземпляра.Если вы получили его с синхронизированным блоком, а затем вызвали статический метод, это нормально.Но вы не можете применить это в коде клиента.Они могут забыть или не знать, что конкретная статическая переменная также используется другими потоками.Поэтому применение этого, как предложил Божо, путем синхронизации статического метода и придания частной переменной экземпляра наилучшего подхода.

Tiberiu

...