Почему нефинальные переменные экземпляра класса разрешены в лямбда-выражениях, а локальные нефинальные переменные — нет?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Почему нефинальные переменные экземпляра класса разрешены в лямбда-выражениях, а локальные нефинальные переменные — нет?

Сообщение Anonymous »

Следующие два листинга кода по отдельности обращаются к нефинальной переменной экземпляра класса и к нефинальной локальной переменной. Первый вариант не вызывал никаких предупреждений/ошибок, а второй вызывал. По моему мнению, они оба вызовут состояние гонки.
Согласно 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) {
}
}
}
листинг кода 2:

Код: Выделить всё

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]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»