对java中的引用变量和原始变量的读写操作是原子的。
说我有以下课程:
public class Example{
private int k;
public void setK(int k){
this.k = k;
}
}
据我所知,它是一个线程安全的,因为整数赋值是原子的。可见性呢?当一个线程更新k时,它意味着其他thead会看到更新的值吗?
在advace中感谢你
答案 0 :(得分:6)
它既不是线程安全的,也不是从一个线程到另一个线程建立可见性。它不是线程安全的,因为this.k = k;
是一个读写操作。为了建立后者,您可以将变量声明为volatile
。在这种情况下,您还可以使用AtomicInteger
。
答案 1 :(得分:1)
据我所知,这是一个线程安全,因为......
如果您向我们展示了整个Example
类,那么它绝对是线程安全的。您的类是线程安全的,因为它没有公开可见的状态。
一个类是"线程安全"如果没有办法从多个线程重叠方法调用将类或其任何实例置于错误状态。您的Example
类无法进入错误状态,因为它不会发布任何任何状态:该类只有一个方法e.setK(int)
,但该方法具有对客户端代码可以看到的任何内容都没有影响。
另一方面,如果你只向我们展示了Example
类的一部分,那么任何人都无法说出该类是否是线程安全的。我们必须看到班上的其他人。除了k
之外还有其他字段吗?他们之间有什么关系?是否存在行为取决于k
的值的方法?您的课程API合约对于k
的不同值的实例表现有什么承诺?
如果没有这些信息,我们甚至无法开始讨论线程安全问题。