多线程java环境中的整数赋值
在java中,对引用变量和基元变量的读写操作是原子的 假设我有以下课程:多线程java环境中的整数赋值,java,multithreading,Java,Multithreading,在java中,对引用变量和基元变量的读写操作是原子的 假设我有以下课程: public class Example{ private int k; public void setK(int k){ this.k = k; } } 据我所知,它是线程安全的,因为整数赋值是原子的。但是能见度呢?当一个线程更新k时,是否意味着另一个线程将看到更新的值 在advace中感谢你它既不是线程安全的,也不能建立从一个线程到另一个线程的可见性。它不是线程安全的,因为this.k=k是一种读
public class Example{
private int k;
public void setK(int k){
this.k = k;
}
}
据我所知,它是线程安全的,因为整数赋值是原子的。但是能见度呢?当一个线程更新k时,是否意味着另一个线程将看到更新的值
在advace中感谢你它既不是线程安全的,也不能建立从一个线程到另一个线程的可见性。它不是线程安全的,因为
this.k=k代码>是一种读写操作。为了建立后者,可以声明变量volatile
。在这种情况下,您还可以使用
据我所知,它是线程安全的,因为
如果您已经向我们展示了整个示例
类,那么它是绝对线程安全的。您的类是线程安全的,因为它没有公开可见的状态
如果无法通过多个线程的重叠方法调用将类或其任何实例置于错误状态,则类是“线程安全的”。您的示例
类不能进入坏状态,因为它不会发布任何状态:该类只有一个方法,e.setK(int)
,但该方法对客户端代码可以看到的任何内容都没有影响
另一方面,如果您只向我们展示了示例
类的一部分,那么任何人都无法确定该类是否是线程安全的。我们得去看看班上的其他同学。除了k
,还有其他字段吗?他们之间的关系是什么?是否存在行为取决于k
值的方法?类的API契约对实例在k
的不同值下的行为做出了哪些承诺
如果没有这些信息,我们甚至无法开始讨论线程安全。您将需要一个volatile
变量。在这种情况下,volatile是必须的吗?是的,请看它只有getter for kIf类还有一个int getK(){return k;}
method然后@manouti的答案适用,因为如果您不声明volatile int k
,则当其他线程调用e.setK(…)
后,任何线程G调用e.getK()
时,k
的值未定义。如果您的类有未定义的行为,那么谈论“线程安全”是没有意义的。