gpt4 book ai didi

java - 确保在不锁定的情况下并发对象调用的最佳方法是什么

转载 作者:行者123 更新时间:2023-11-30 06:13:47 25 4
gpt4 key购买 nike

我有以下对象:

// 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;
}
}

最佳答案

您的代码尚未发展到具有竞争条件;目前它包含更严重的东西,即数据竞赛。在不引入写入和 future 读取之间的先于关系的情况下跨线程发布引用意味着读取器可以看到处于部分初始化、不一致状态的数据对象。您提出的解决方案对此没有帮助。

一旦您将data 字段设为volatile,只有然后您才会在第一个读取data 的线程之间出现竞争条件 引用,然后另一个线程更新 data 引用,然后第一个线程从旧数据读取 isActive。对于您的逻辑来说,这实际上可能是一个良性案例。

关于java - 确保在不锁定的情况下并发对象调用的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31415547/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com