【发布时间】:2021-03-13 18:49:32
【问题描述】:
请告知解决以下问题的最佳方法:
我有一个java类如下:
@Service
public class ServiceAImpl {
private final Set<String> someSet = new HashSet<>();
private final List<Record> someList = new ArrayList<>();
private final Map<String, String> someMap = new HashMap<>();
//Loads XML as a document
public Optional<Document> readXML(Document xmlDoc){
}
//reads the root node and triggers the recursive extraction of the XML data
public List<Record> extractRootNodeAndTriggersRecursive(){
extractXMLRecursively(elt);
}
//recursively read hierarchical data in the XML
public SomeObject extractXMLRecursively(Element elt){
}
public SomeObject createReportFromTheMapOrList(){
}
}
我知道实例成员(或列表/映射)不是线程安全的。
请问在需要通过多次调用同一类中定义的多个方法来更新或填充列表/集合/映射的逻辑时,最好的方法是什么。
因此,在另一个调用类(主 Springboot 应用程序)中,我将获取列表/设置/映射以在填充后处理它们。
我认为上述代码可能适用于按计划每周运行一次的独立应用程序,即并发性不会成为问题。但是,如果服务暴露给多个线程,我应该如何修改它?
有人遇到过这种情况吗?
任何想法或提示或参考将不胜感激。
谢谢。
【问题讨论】:
-
你可以使用线程安全的集合和映射,即
CopyOnWriteArrayList,如果你写的很少,或者List<Record> someList = Collections.synchronizedList(new ArrayList<>())。对于地图,您可以使用ConcurrentHashMap,对于集合,存在ConcurrentSkipListSet,或者您也可以使用Map<String, String> someMap = Collections.newSetFromMap(new ConcurrentHashMap<>()) -
感谢 fps。根据 nahaev 建议的答案,这与使用 ReentrantLock 相比如何?
-
锁允许一次同步访问多个集合,即将元素添加到三个集合并原子地执行该操作
标签: java multithreading spring-boot spring-batch java.util.concurrent