Окончательная переменная и синхронизированный блок в Java

StackOverflow https://stackoverflow.com/questions/2101327

Вопрос

Что такое окончательная переменная в Java? Например: если я напишу final int temp; В функции что означает окончательное ключевое слово?
Кроме того, когда я хочу использовать окончательную переменную (как в качестве переменной класса, так и в качестве переменной функции)?
Почему переменные в синхронизированном блоке должны быть объявлены окончательными?

Это было полезно?

Решение

В основном это просто означает, что вы не можете изменить значение. Например, переменные, вы должны назначить любые окончательные переменные один раз (и только один раз) в конструкторе (или с переменным инициализатором). Синхронизация - это красивая ортогональная концепция.

Основная причина создания местный Переменная окончательная финала, поэтому вы можете использовать его в анонимном внутреннем классе ... это не имеет ничего общего с тем, чтобы быть в синхронизированном блоке.

Окончательные переменные находятся Полезно для неизменных классов, по общему признанию - и неизменность облегчает жизнь в многопоточной среде - но это единственная связь между двумя, о которых я могу подумать ...

РЕДАКТИРОВАТЬ: Комментарий Wildwezyr имеет смысл с точки зрения не изменить переменную на котором вы синхронизируете. Анкет Это было бы опасно, по причинам, которые ему дали. Это то, что вы имели в виду под «переменной в синхронизированном блоке»?

Другие советы

Окончательные переменные и синхронизированные кодовые блоки имеют что-то общее ... если вы объявляете нефинальную переменную a а затем напишите synchronized (a) { System.out.println('xxx'); } Вы получите предупреждение «Синхронизация на нефинальном поле» - по крайней мере, в Netbeans.

Почему вы не должны синхронизировать на не-финале? Поскольку, если значение поля может измениться, то различные потоки могут синхронизировать на разных объектах (разные значения поля) - так что не может быть никакой синхронизации вообще (каждый поток может вводить синхронизированный блок одновременно).

Посмотрите, например, реальные проблемы, вызванные синхронизацией на нефинальном поле: http://forums.sun.com/thread.jspa?threadid=5379204

В дополнение к тому, что сказал Джон Скит, значение нельзя изменить, но содержимое может быть изменено.

final Integer one = new Integer(1);
...
one = new Integer(2); // compile error

final List list = new ArrayList();
...
list = new ArrayList(); // compile error
list.add(1); // Changes list, but that's fine!

Также имейте в виду, что окончательный и статический финал не совпадает. Финал находится в рамках экземпляра, тогда как статический финал одинакова для всех случаев класса (на других языках это можно назвать константой).

Лично я думаю, что преимущество окончательного, даже если это не обязательно для того, чтобы заставить ваше программное обеспечение работать, является семантическим значением. Он предлагает вам возможность сказать компилятору и следующий человек, работающий над этим кодом что эта переменная не предназначена для изменения, и что попытка изменить ее может привести к ошибке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top