Последняя переменная и синхронизировала блок в Java

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

6
задан Agricola 8 August 2018 в 12:39
поделиться

3 ответа

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

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

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

Редактировать: комментарий Wildwezyr имеет смысл в том, что он не изменяет переменную , на котором вы синхронизируете . Это было бы опасно, по причинам, по которым он дан. Это то, что вы имели в виду под «переменную в синхронизированном блоке»?

14
ответ дан 8 December 2019 в 02:52
поделиться

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

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

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

14
ответ дан 8 December 2019 в 02:52
поделиться

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

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!

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

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

4
ответ дан 8 December 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: