Согласно JLS §15.27.2:
Ограничение для эффективного завершения переменных запрещает доступ к динамически изменяющимся локальным переменным, захват которых, скорее всего, приведет к проблемам параллелизма.
Однако, если они действительно хотят снизить риск проблем параллелизма, почему бы также не запрещает доступ к неконечным переменным экземпляра класса?
листинг кода 1 (без предупреждения/ошибки компилятора):
Код: Выделить всё
public class Main {
private int a = 0;
private void run() throws Exception {
Runnable task = () -> {
for (int i = 0; i < 1000; i++) {
a++;
}
};
Thread t1 = new Thread(task);
Thread t2 = new Thread(task);
t1.start();
t2.start();
t1.join();
t2.join();
}
public static void main(String[] args) {
try {
new Main().run();
} catch (Exception ignore) {
}
}
}
Код: Выделить всё
public class Main {
private void run() throws Exception {
int a = 0;
Runnable task = () -> {
for (int i = 0; i < 1000; i++) {
a++;
Подробнее здесь: [url]https://stackoverflow.com/questions/79219604/why-non-final-class-instance-variables-are-allowed-in-lambda-expressions-but-loc[/url]