线程安全复合操作概念

假定有两个操作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);
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值