gpt4 book ai didi

Java并发: CopyOnWriteArrayList behavior

转载 作者:行者123 更新时间:2023-11-30 05:52:08 27 4
gpt4 key购买 nike

我需要将一些对象存储到数据库中。

首先

  1. 我将它们存储在内存中(存储在集合中)
  2. 当其中一个正确存储在数据库中时,我会将其删除

所以,

public class AuditService {
private CopyOnWriteArrayList<Audit> copyWrite;

public void flush(Audit... audits) {
Collection<Audit> auditCollection = Arrays.asList(audits);
this.copyWrite.addAll(auditCollection);

this.copyWrite.forEach(audit -> {
// save audit object on database
this.copyWrite.remove(audit);

});
}
}

我必须是线程安全的,我的意思是,AuditService是一个单例类,我有几个线程可以同时到达flush方法。

我的问题是:

  1. CopyOnWriteArrayList 究竟是如何工作来解决并发问题的。
  2. 这段代码正确吗?

最佳答案

CopyOnWriteArrayList 通过在数据更改时复制底层数组来提供线程安全性。示例中的诸如 addAll() 之类的变异操作由 CopyOnWriteArrayList 在内部同步。

但是您的代码没有什么意义,因为在 flush() 方法之外无法访问 copyWrite 字段。本地方法变量是线程安全的,因此您的代码可以简化为:

public void flush(Audit... audits) {
for (Audit a : audits) {
// save audit object on database
}
}

问题是如果 Audit 对象被修改会发生什么。希望您将它们设置为不可变,因为更改 Audit 事件没有什么意义。

关于Java并发: CopyOnWriteArrayList behavior,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53722866/

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