【发布时间】:2015-12-19 03:53:01
【问题描述】:
我有一个多线程 Java 程序,其中很少有 long 类型的常量在由多个线程调用的函数中读取。这些读取/赋值操作在synchronized 块之外,并且这些常量在与被调用的函数/synchronized 块相同的类中声明。
将这些长常量设为volatile 是否可取?一旦初始化,这些常量就不会被改变。我没有看到任何不正确的程序行为,但只是想澄清一下。
这是伪代码,
public class ThreadSafeClass {
private long long_val = 100;
public int calculate(){
long local_long=long_val;
synchronized(this){
//use local_long
}}}
【问题讨论】:
-
没有 volatile 常量这种东西,但这里也没有 long 类型的常量变量。有整数常量和非常量长变量。您在这里缺少的是“final”,这将使长变量保持不变,从而消除您的问题。
-
请定义 you 所指的“常数”(在您的程序上下文中)。你如何定义你的常量?如果它没有使用
final关键字,你可能做错了。 -
感谢您的回复,我说不变是因为它在代码中的其他任何地方都没有改变,尽管原始开发人员没有使用
final。我认为,将其设为final将消除混淆,并且不需要volatile(使用变量的方式) -
那是正确的。
标签: java multithreading volatile