我需要将一些对象存储到数据库中。
首先,
所以,
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是如何准确地工作以解决并发性的。发布于 2018-12-11 11:24:54
CopyOnWriteArrayList通过在数据更改时复制基础数组来提供线程安全。在您的示例中,像addAll()这样的Mutator操作在内部由CopyOnWriteArrayList同步。
但是,您的代码没有什么意义,因为copyWrite字段不在flush()方法之外被访问。本地方法变量是线程安全的,因此可以将代码简化为:
public void flush(Audit... audits) {
for (Audit a : audits) {
// save audit object on database
}
}问题是,如果修改了Audit对象,会发生什么。希望您使它们不可变,因为更改Audit事件没有什么意义。
https://stackoverflow.com/questions/53722866
复制相似问题