【发布时间】:2016-05-19 01:47:12
【问题描述】:
这个类可以在多线程中使用,因为它是线程安全的。
public class Hello {
private int value = 0;
public synchronized int get() {
return value;
}
public synchronized void set(int value) {
this.value = value;
}
}
我知道除了set()之外,get()时我们必须使用同步的原因是内存可见性。
java volatile 关键字可用于内存可见性。
那么......这个类也是线程安全的??
public class Hello {
private volatile int value = 0;
public int get() {
return value;
}
public synchronized void set(int value) {
this.value = value;
}
}
【问题讨论】:
-
用AtomicInteger怎么样
-
顺便说一句,我认为你的第一个类不一定是线程安全的,你应该锁定一个外部对象
-
在这种特定情况下,我相信
synchronized不是必需的:1. Java 中int的读/写保证是原子的(不适用于长/双/引用)它们是您访问value的唯一两种方式。 2.volatile保证发生之前(这是synchronized的另一个原因) -
我们可以使用 AtomicInteger 但这不是这个问题的重点,我只想知道 volatile 可以在读取方法时使用,而不是同步。
-
标题中的问题在问题正文中得到了回答。您的真正问题是关于
volatile。即使没有同步,您的第二个示例也是线程安全的。volatile这样做。
标签: java java.util.concurrent concurrent-programming