繁体   English   中英

确保并发对象调用而不锁定的最佳方法是什么

[英]What is the best way to ensure concurrent object calls without locking

我有以下对象:

// this class is immutable, acts like container for several properties.
public class MyDataAddOps{
    private final boolean isActive;
    private final Map<String,Object> additionalProps;

    public MyDataAddOps(boolean isActive, Map<String,Object> additionalProps){
       this.isActive = isActive;
       this.additionalProps = additionalProps;
    }

   public boolean isActive(){return isActive;}
   public Map<String,Object> getAdditionalProps(){ return additionalProps;}
}

// this class acts as "spring" bean that calls load on construction,
//  and then another scheduler bean calls the load per some cron expression (once a minute for example) 
public class MyDataAddOpsService{
   private MyDataAddOps data;

   // this method will be executed periodically outside
   // via some spring quartz for example
   // the quartz is not re-entrant  
   public void load(){
      // opens some defined file and returns content string 
      String fileData = getFileContent(); 
      boolean isActive = getIsActive(fileData);
      Map<String, Object> props = getProps(fileData);
      data = new MyDataAddOps(isActive, props);
   }

  // This method is executed by many workers threads inside the application
  public boolean isActive(){
     return data.isActive();
  }

  public final Map<String, Object> getProps(){
      return data.getAdditionalProps();
  } 
 }

这种方法可能具有一个竞争条件,其中一个线程执行isActive()而另一线程执行load() 尽管它在参考上运行并且对象状态未更改。

支持此类并发的最佳解决方案是什么? 我想避免方法同步,也避免读写锁定。

也许是AtomicReferencevolatile 还是最好只返回对数据本身的引用而没有代理方法呢? 因此,根本不需要锁定,并且所有使用逻辑都在此服务之外吗?

 public class MyDataAddOpsService{
   private MyDataAddOps data;
   public void load(){
     ....
     data = new MyDataAddOps(isActive, props);
   }

 public MyDataAddOps getData(){
    return data;
  }
 }

您的代码还没有朝着产生竞争条件的方向发展。 当前它包含更严重的东西,这是一场数据竞赛 跨线程发布引用而不会在写入和将来读取之间的关系发生之前发生 ,这意味着读取器可以看到处于部分初始化的不一致状态的数据对象。 您提出的解决方案对此无济于事。

一旦你的data字段中volatile ,只有这样 ,你之间的一个线程首先阅读的竞争条件data引用,那么另一个线程更新data的参考,那么第一个线程读取isActive从旧数据。 对于您的逻辑而言,这实际上可能是一个良性案例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM