【发布时间】:2012-07-17 12:57:22
【问题描述】:
如果多个线程读取之前设置的原始类型并且以后不会更改,它们会得到错误的值吗?
例如,假设下面的简单代码摘录:
public static final boolean proceed = read(); // Read the value from a file
public static void doSomething() // Method accessed by multiple threads
{
if (proceed)
{
System.out.println("TRUE");
}
else
{
System.out.println("FALSE");
}
}
假设proceed变量初始化为true,是否有可能在同时运行doSomething()方法的多个线程中的一个或多个线程中,打印的消息是FALSE?
如果proceed 变量是可变的,那肯定是可能的,因此需要同步,或使用AtomicBoolean(例如,根据this question)。但在这种情况下,proceed 是不可变的,并且只在包含类的静态初始化期间设置一次。
对于其他原始类型也是如此,如果一个值设置为 final,那么之后访问它应该始终是线程安全的,对吗?
【问题讨论】:
标签: java thread-safety primitive