java - Java 并发:CopyOnWriteArrayList 行为
问题描述
我需要将一些对象存储到数据库中。
首先,
- 我将它们存储在内存中(放入集合中)
- 当其中一个正确存储在数据库中时,我将其删除
所以,
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
是一个单例类,我的几个线程可以同时到达 atflush
方法。
我的问题是:
CopyOnWriteArrayList
为了解决并发问题,它是如何工作的。- 这段代码正确吗?
解决方案
CopyOnWriteArrayList
通过在数据更改时复制底层数组来提供线程安全。像您的示例中那样的 Mutator 操作addAll()
在内部由CopyOnWriteArrayList
.
但是,您的代码没有什么意义,因为copyWrite
在方法之外无法访问字段flush()
。局部方法变量是线程安全的,因此您的代码可以简化为:
public void flush(Audit... audits) {
for (Audit a : audits) {
// save audit object on database
}
}
问题是如果Audit
对象被修改会发生什么。希望您使它们不可变,因为更改Audit
事件几乎没有意义。
推荐阅读
- ios - 升级到 RN 0.66 和 Xcode 13 'gtest/gtest.h' 文件后无法在 Xcode 上构建 iOS 应用程序
- php - WooCommerce 来自变体属性的打开模式 - 类似于尺寸图
- apache-kafka - 使用已注册架构的 kafka-avro-console-consumer - 错误 500
- javascript - 如何成功注销并导航回 React-Native 中的主应用程序屏幕?
- javascript - 将字符串时间转换为时间戳以计算日期时差?
- java - Java,从长字符串中提取定义字符内的整数值
- spring - 终端中 SpringBoot REST API 的邮递员 POST 调用中不支持的媒体类型
- sql - 如何应用:大查询中的count(distinct ...)超过(partition by ... order by)?
- c# - 如何使用方法写入通用数组?指定类型后,通用数组不会更改数据类型
- python - 在 pandas df 中预处理大量文本的更有效方法?