【发布时间】:2018-12-11 12:13:23
【问题描述】:
我正在尝试将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 -> {
try {
// save audit object on database
this.copyWrite.remove(audit);
} catch (DataAccessException e) {
// log it
}
});
}
}
这段代码的作用是:
- 首先将审核存储到缓冲区
CopyOnWriteArrayList。 - 尝试将审核保存到数据库
- 存储后,会从缓冲区
CopyOnWriteArrayList中删除。
其他:
-
AuditService是一个单例类 -
flush方法可以被多个线程访问。
问题:
- 我猜
this.copyWrite.forEach(audit -> {...可以被多个线程同时访问:这是否意味着同一个审计对象可以尝试在数据库中保存两次? - 每次对
CopyOnWriteArrayList进行修改操作时,都会在其他线程上填充一个新副本?它是如何填充的?
【问题讨论】:
标签: java multithreading java.util.concurrent