enable(): enable sleeping mode (do nothing if already enabled)
disable(): disable sleeping mode (do nothing if already disabled)
do nothing if already enabled (disabled)
- это плохой дизайн, который может привести к тонким ошибкам, которые трудно воспроизвести и обнаружить.Например, пусть спящий режим отключен, и один поток вызывает disable()
, а другой - enable()
.В зависимости от того, какой вызов сделан первым, режим будет оставаться включенным или отключенным навсегда.Чтобы сделать выполнение более детерминированным, должны учитываться включение и отключение, и будет определено (отключено) окончательное состояние.
Вместо этого ваши потоки должны обмениваться токенами , которые не маскируют друг друга.Помимо CountdownLatch
(который фактически является счетчиком запретов), JDK имеет CyclicBarrier
и Phaser
, которые являются сбрасываемыми счетчиками запретов, и Semaphore
, который является счетчиком разрешений.
UPDT эта реализация может работать (я не проверял это):
Phaser p = new Phaser(1);
public void await() {
p.arriveAndAwaitAdvance();
}
public void enable() {
p.register();
}
public void disable() {
p.arriveAndDeregister();
}
N последовательных вызовов к enable()
требуется одинаковое число disable()
для прохождения ожидающего потока.