java中的最终变量和同步块

Java中的最终变量是什么? 例如:如果我写final int temp; 在函数中final关键字的含义是什么?
此外,我什么时候想使用最终变量(作为类变量和函数变量)?
为什么同步块中的变量必须声明为final?

基本上它只是意味着你无法改变价值。 对于实例变量,您必须在构造函数(或使用变量初始值设定项)中分配一次(并且仅一次)任何最终变量。 同步是一个非常正交的概念。

使局部变量最终的主要原因是你可以在匿名内部类中使用它…这与在同步块中无关。

无可否认,最终变量对于不可变类非常有用 – 并且不变性使得在multithreading环境中生活更轻松 – 但这是我能想到的两者之间的唯一关系……

编辑:Wildwezyr的评论在不改变您正在同步的变量方面是有意义的。 由于他给出的原因,这将是危险的。 这就是“同步块中的变量”的意思吗?

最终变量和同步代码块确实有一些共同点……如果你声明非最终变量a然后写synchronized (a) { System.out.println('xxx'); } 您将收到警告“非最终字段上的同步” – 至少在NetBeans中。

为什么你不应该在非最终领域同步? 因为如果字段值可能改变,则不同的线程可能在不同的对象(字段的不同值)上同步 – 因此根本不存在同步(每个线程可以同时进入同步块)。

在这里查看一下在非最终字段上同步导致的现实问题: http : //forums.sun.com/thread.jspa?threadID = 5379204

除了Jon Skeet所说的,价值不能改变,但内容可能会改变。

 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! 

还要注意,final和static final不一样。 final在实例的范围内,而static final对于类的所有实例都是相同的(在其他语言中,这可以称为常量)。

就个人而言,我认为final的优势,即使并非绝对需要让您的软件正常工作,也具有语义含义。 它为您提供了向编译器和下一个处理该代码的人说这个变量不应该被更改的可能性,并且尝试更改它可能会导致错误。