Добрый вечер.
У меня два разных, но взаимосвязанных вопроса, поэтому спрошу их в одной теме.
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. А как правильно из лямбды просигналить о завершении работы?