Почему нефинальные переменные экземпляра класса разрешены в лямбда-выражениях, а локальные нефинальные переменные — нет?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 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Почему нефинальные переменные экземпляра класса разрешены в лямбда-выражениях, а локальные нефинальные переменные — нет?
    Anonymous » » в форуме JAVA
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Почему переменные экземпляра разрешены вне класса? [дубликат]
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Лучшая практика: статические нефинальные переменные Java
    Anonymous » » в форуме JAVA
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • События в лямбда-выражениях – ошибка компилятора C#?
    Anonymous » » в форуме C#
    0 Ответы
    30 Просмотры
    Последнее сообщение Anonymous
  • Elsa Workflow Studio использует переменные в выражениях
    Anonymous » » в форуме C#
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous

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