我需要将一些对象存储到数据库中。
首先
所以
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
方法中到达多个线程。
我的问题是:
CopyOnWriteArrayList
到底如何工作才能解决并发问题。答案 0 :(得分:1)
CopyOnWriteArrayList
通过在数据更改时复制基础数组来提供线程安全性。示例中的addAll()
之类的Mutator操作由CopyOnWriteArrayList
内部同步。
但是,由于copyWrite
方法外部没有访问flush()
字段,因此您的代码毫无意义。本地方法变量是线程安全的,因此您的代码可以简化为:
public void flush(Audit... audits) {
for (Audit a : audits) {
// save audit object on database
}
}
问题是如果修改Audit
对象会发生什么。希望您使它们不变,因为更改Audit
事件几乎没有意义。