【发布时间】:2019-10-02 17:46:30
【问题描述】:
在《Java Concurrency in Practice》一书中,3.1.1 状态数据一节下,有一段代码
@NotThreadSafe
public class MutableInteger {
private int value;
public int get() { return value; }
public void set(int value) { this.value = value; }
}
这不是线程安全的,因为:
如果一个线程调用set,其他线程调用get可能会也可能不会看到 那个更新。
而在 set 和 get 方法上使用同步关键字使其“正确”。怎么样?
@ThreadSafe
public class SynchronizedInteger {
@GuardedBy("this") private int value;
public synchronized int get() { return value; }
public synchronized void set(int value) { this.value = value; }
}
如果 value 为 0,并且线程 A 调用了 set(2),而线程 B 调用了 get(),B 可能会得到值 0,然后 A 会将其设置为 2...之前的代码已经这样做了.那么我们从同步代码中得到了什么好处..
可能是我遗漏了什么,但请指导。谢谢
【问题讨论】:
标签: java multithreading