竞态条件和临界区
竞态和临界区
当多个线程写入相同资源的时候,可能会发生问题。但是,如果数据没有变化的话,多个线程读取相同资源倒是没有问题。
下面有个例子,如果多个线程同时处理的话就会发生问题
public class Counter {
protected long count = 0;
public void add(long value) {
this.count = this.count + value;
}
}
有可能出现两个线程通知执行了 Counter.add() 方法,这时候就会出现问题。这就是竞态。这个 add() 方法就是临界区。
如何防止竞态
有几个方法
- 同步代码块(synchronization block)
- locks
- java.util.concurrent.atomic.AtomicInteger