2015-05-06 3 views
4

В docs для CountDownLatch я вижу что-то вроде:Java: есть CountDownLatch потокобезопасны

 
public void run() { 
     try { 
     startSignal.await(); 
     doWork(); 
     doneSignal.countDown(); 
     } catch (InterruptedException ex) {} // return; 
} 

Здесь startSignal и doneSignal являются CountDownLatch объекты.

В документах ничего не говорится о том, что класс является потокобезопасным или нет.

+1

Определить * потокобезопасность * в этом случае. – OldCurmudgeon

+0

Нить безопасно, в этом случае, например, было бы гарантировать, что только один поток вызывает 'countDown' за раз. Подпись не говорит, что она синхронизирована: 'public void countDown()' – treecoder

+0

'CountDownLatch' гарантирует, что' await' будет блокироваться до тех пор, пока 'countDown()' не будет вызван точно указанным числом раз, независимо от того, сколько потоков может называться в то же время. – Misha

ответ

4

Как он предназначен для использования нескольких потоков, было бы справедливо предположить, что является потокобезопасной для большинства значений поточно-.

Существует даже есть Случается, перед тем обязательства (от your link):

непротиворечивости памяти эффектов: До тех пор пока счетчик не дойдет до нуля, действия в потоке перед вызовом CountDown() произойдет, прежде чем действия после успешное возвращение из соответствующего ожидания() в другой поток.

Что касается вашего конкретного вопроса Что делать, если два потока называют countDown в то же время? Разве это не просто действие счетного действия только один раз эффективно? Нет, два действия будут выполняться каждый раз.

+0

Но не следует ли синхронизировать сам 'countDown'? Что делать, если два потока одновременно называют countDown? Разве это не просто действие счетного действия только один раз эффективно? – treecoder

+2

@treecoder вы, кажется, приравниваете «метод потокобезопасен», когда «метод синхронизирован». Это неверно. Существует несколько способов сделать поток потокобезопасным без его синхронизации. CountDownLatch использует неблокирующие поточно-безопасные операции. Все под java.util.concurrent предназначено для использования несколькими потоками. –