Boolean и его замыкания
От: f95.2  
Дата: 02.05.20 19:00
Оценка:
Добрый вечер.
У меня два разных, но взаимосвязанных вопроса, поэтому спрошу их в одной теме.

1. Пусть есть код
Boolean b = false;


Что здесь происходит? Создается новый объект Boolean, и ему присваивается значение false (которое он сохраняет где-то внутри),
или просто ссылке b присваивается значение Boolean.FALSE?

Откуда следует ответ на предыдущий вопрос? Он прописан в стандарте (я его не читал еще, разбираюсь же только), или зависит от реализации?


2. Пусть есть код

Boolean flag = false;
Consumer<Object> handler = (Object) -> {
    synchronized (flag) {
        flag = true;
        flag.notifyAll();
    }
};


Компилятор ругается на него: "local variables referenced from a lambda expression must be final or effectively final", причем в трех местах — на synchronized, на присваивание true и на notifyAll.
Почему?

На присваивание true вроде понятно — если flag: это ссылка на Boolean.FALSE, то получается, что мы меняем ссылку (она начинает ссылаться на Boolean.TRUE).
Но почему компилятор не дает синхронизироваться и сделать нотификацию? Ведь тут нет изменений ссылки.


P.S.
3. А как правильно из лямбды просигналить о завершении работы?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.