java - 多个线程读取原始类型

标签 java thread-safety primitive

如果多个线程读取先前设置的基本类型并且此后不会更改,它们会得到错误的值吗?

例如,假设以下简单代码摘录:

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/

相关文章:

java - 如何使用Java代码从具有嵌套数据的Json数组中获取值

java - ConcurrentHashMap 实现和限制

c# - .ToList() 线程安全

c - 使用二进制信号量实现计数信号量

java - 尝试在泛型中使用原始类型时出现奇怪的编译时行为

java - 计算结束时间和开始时间差(以分钟为单位)并验证在 android 中输入的时间

c# - Java 中的 vb.net 'friend' 关键字等价于什么?

java - 如果我在非 EDT 的单个线程上处理 GUI,它仍然是线程安全的吗?

objective-c - C/Java/等。 Objective-C 中的样式数组

java - 基元上的 System.identityHashCode() 行为