java中的最终变量和同步块

Saj*_*ani 6 java variables final synchronized

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

Jon*_*eet 14

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

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

最后的变量对一成不变的类有用,固然-和永恒让生活在多线程环境中更容易-但是这两个是我能想到的之间的唯一关系...

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

  • 你有没有见过这个警告:"在非最终领域同步"? (3认同)

Wil*_*zyr 14

最终变量和同步代码块确实有一些共同之处......如果你声明非final变量a然后写入,synchronized (a) { System.out.println('xxx'); }你会收到警告"非最终字段上的同步" - 至少在NetBeans中.

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

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