假定有两个操作a和b,如果从执行a的线程来看,当另一个线程执行b时,要么将b完全执行完,要么完全不执行b,那么a和b对彼此来说是原子的,原子操作是指,对于访问同一个状态的所有操作来说,这个操作是一个以原子方式执行的操作
//非线程安全的延迟初始化
@NotThreadSafe
public class LazyInitRace{
private ExpensiveObject instance = null;
public ExpensiveObject getInstance(){
if(instance == null){
instance = new ExpensiveObject();
}
return instance;
}
}
包含了一个竞态条件,假定线程a和b同时执行getInstance()方法,a看到instance为空,因而创建一个新的ExpensiveObject实例,b同样需要判断instance是否为空,此时的instance是否为空,取决于不可预测的时序,以及a花多少时间来初始化对象,如果b在判断对象是否为空的时候,正好a线程在判断或者a线程并未初始化完成,那会导致两次getInstance获得不同的结果
要避免竞态问题,就必须一个线程使用该变量的时候,阻止其他线程使用该变量
//使用AtomicLong类型来统计已处理请求的数量
@ThreadSafe
public class CountingFactorizer implements Servlet{
private final AtomicLong count = new AtomicLong(0);
public long getCount( return count.get(); )
public void service(ServletRequest request,ServletResponse response){
BigInteger i = extractFromRequest(request);
BigInteger[] factors = factor(i);
count.incrementAndGet();
encodeIntoResponse(resp,factors);
}
}