如果多个线程读取先前设置的基本类型并且此后不会更改,它们会得到错误的值吗?
例如,假设以下简单代码摘录:
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,那么之后访问它应该始终是线程安全的,对吗?
最佳答案
您的变量是final
这一事实保证了所有线程都会看到它处于一致的初始化后状态。这也适用于对象的引用(即,如果对象已初始化为非空引用,则所有线程都会看到该对象的非空值 - 但如果您的对象不是线程安全的,则某些线程可能会看到该对象本身不一致或过时的状态)。
ps:假设您的读取方法不会尝试读取 boolean 值,在这种情况下它将看到默认(假)值。
关于java - 多个线程读取原始类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11542242/