Добрый вечер.
Пусть есть 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'а?
Через класс-обертку?