Синхронизация через enum-переменную
От: f95.2  
Дата: 25.04.20 22:53
Оценка:
Добрый вечер.
Пусть есть enum:
private enum State {
    STATE1,
    STATE2,
    STATE3;
}


И поле этого типа:
private volatile State state;


Я работаю с ним в нескольких потоках.
Где-то просто читаю:
if (state == State.STATE2) {
   ...
}


Где-то меняю с нотификацией:
synchronized(state) {
    state = State.STATE3;
    state.notifyAll();
}


А где-то жду нотификации:
synchronized(state) {
    while(state != STATE3)
        state.wait();
}


И вопрос: а можно ли так делать?
Насколько я понимаю, в джаве элементы enum'а — это объекты этого самого enum'а.
А переменная типа enum — это просто ссылка на объект.

Соответственно, когда мы делаем state.wait() — мы ждем на мониторе одного объекта,
а когда делаем
state = State.STATE3;
state.notifyAll();

— то это уже нотификация на мониторе другого объекта.

Правильно ли я понимаю ситуацию? И если да, то как правильно синхронизироваться на мониторе enum'а?
Через класс-обертку?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.