java - 具有非最终成员且没有修改器方法的类的线程安全性

标签 java thread-safety immutability final

对于下面的类,将 mNumSides 设置为最终类有何含义? “线程安全”是否受到影响?

class Shape {
    private int mNumSides;

    public Shape(int numSides) {
        mNumSides = numSides;
    }

    public int getNumSides() {
        return mNumSides;
    }
}

最佳答案

绝对是的。 final 关键字保证所有线程始终看到相同的 mNumSides 值。有关 final 及其对内存模型影响的更多信息 here .

如果不使用final,对象可能会不一致地发布到其他线程,并且线程有可能(尽管极低)将mNumSides 的值视为0 而不是构造函数中传递的 numSides 。 使其 volatile 静态也可以工作。

关于java - 具有非最终成员且没有修改器方法的类的线程安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17623042/

相关文章:

java - Spring 时间表相互冲突

java - 如何使用波斯 JDF 日期类?

go - 正在将标准库日志重定向到 logrus 线程安全

python - 是否可以防止从卡住的 python 数据类中读取?

java - GridBagLayout Java - WeightY 导致意外结果

java - 从数据数组创建 javafx 图像

c++ - 在线程 A 中创建 std::thread 对象,加入线程 B

Python队列链接对象运行异步协程与主线程输入

javascript - ImmutableJS - 只更新对象中的一个键值

java - 循环中 java.util.Map.putAll(Map<>) 和 java.util.Map.put(Integer, Object) 有什么区别