Что такое последняя переменная в Java? Например: если я пишу final int temp;
в функции, каково значение заключительного ключевого слова?
Кроме того, когда я хотел бы использовать последнюю переменную (и в качестве переменной класса и в качестве функциональной переменной)?
Почему должен переменные в синхронизируемом блоке быть объявленным финалом?
В основном это просто означает, что вы не можете изменить значение. Например, переменные вы должны назначить любые окончательные переменные один раз (и только один раз) в конструкторе (или с переменным инициализатором). Синхронизация - довольно ортогональная концепция.
Основная причина создания локальных переменных финала, так что вы можете использовать его в анонимном внутреннем классе ... Это не имеет ничего общего с тем, что в синхронизированном блоке.
Окончательные переменные являются полезными для неизменных классов, по общему признанию - и неизменность облегчает жизнь в многопоточной среде - но это единственные отношения между тем, что я могу думать ...
Редактировать: комментарий Wildwezyr имеет смысл в том, что он не изменяет переменную , на котором вы синхронизируете . Это было бы опасно, по причинам, по которым он дан. Это то, что вы имели в виду под «переменную в синхронизированном блоке»?
Окончательные переменные и синхронизированные блоки кода имеют что-то общее ... если вы объявляете нефинансовую переменную A
, а затем написать синхронизированные (A) {система .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!
Также осознавать, что финальные и статические финалы не одинаковы. Финал находится в пределах объема экземпляра, тогда как статический финал одинаков для всех экземпляров класса (на других языках это можно назвать постоянной).
Лично я думаю, что преимущество финала, даже если не совсем обязано получить работу вашего программного обеспечения, находится в семантическом смысле. Он предлагает вам возможность сказать компилятору и следующим человеком, работающим над этим кодом , что эта переменная не предназначена для изменений, и что пытается изменить его, может привести к ошибке.