Я попытаюсь объяснить вопрос, взяв следующие 3 случая.
ДЕЛО I:
Я использовал общую блокировку для синхронизации, используя что-то вроде этого:
private static final String SHARED_LOCK = "shared_lock";
private static int i = 0;
private static int j = 0;
void increment() {
synchronized (SHARED_LOCK) {
i++;
j++;
}
}
И работает нормально.
СЛУЧАЙ II:
Теперь то, что я изменил здесь, вместо использования общей блокировки, я подумал об использовании локальной блокировки, выполнив что-то вроде этого:
private static int i = 0;
private static int j = 0;
void increment() {
final String LOCAL_LOCK = "local_lock";
synchronized (LOCAL_LOCK) {
i++;
j++;
}
}
И я обнаружил, что код все еще работает нормально, то есть синхронизация все еще работает.
СЛУЧАЙ III:
Однако, когда я изменил локальный locl на это:
final String LOCAL_LOCK = new String("local_lock");
тогда синхронизация прошла. Таким образом, похоже, что в CASE II локальная блокировка была в состоянии обеспечить синхронизацию из-за интернализации литералов String, которые Java делает для нас автоматически, но в CASE III, поскольку я явно создавал новую String каждый раз, таким образом, синхронизация не происходила.
Итак, возвращаясь к моему первоначальному вопросу. Кто-нибудь чувствует, что CASE II не является правильным способом достижения синхронизации? Если да, не могли бы вы также упомянуть, почему?
Заранее спасибо,
SacTiw.