2016-10-23 15 views
0

В этом учебном пособии (link) о нестабильной декларации Java сказано, что изменчивое объявление может быть альтернативой синхронизации.Синхронизация в качестве альтернативы декларации volatile

пример автора о применении летучей декларации:

volatile boolean shutdownRequested; 

... 

public void shutdown() { shutdownRequested = true; } 

public void doWork() { 
    while (!shutdownRequested) { 
     // do stuff 
    } 
} 

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

volatile boolean shutdownRequested; 

... 

synchronized public void shutdown() { shutdownRequested = true; } 

synchronized public void doWork() { 
    while (!shutdownRequested) { 
     // do stuff 
    } 
} 

кажется, что если поток А вызывает shutdown в то время как поток B имеет уже вызывается и работает doWork Казалось бы, поток B будет постоянно блокировать выполнение, потому что это цикл. Кажется, это не дает возможности потоку A получить доступ к булевому. Что автор имел в виду как синхронизированную альтернативу изменчивой декларации?

+0

Статья начинается с того, что 'volatile' не является, вообще говоря, является заменой для надлежащего официального блокировки. –

+0

Да, но этот вопрос касается того, как блокировка является альтернативой использованию изменчивой декларации. – H2ONaCl

ответ

1

Часть // do stuff будет находиться за пределами синхронизированного блока. Например, вместо doWork синхронизируется и имеет while (!shutdownRequested), у вас может быть while (!getShutDown()), где getShutDown - это синхронизированный метод, который возвращает shutdownRequested.

0

Вот один из способов это может работать:

public void doWork() { 
    while (true) { 
     synchronized (this) { 
      if (shutdownRequested) { 
       break; 
      } 
     } 
     // do stuff 
    } 
}