Java并发:CopyOnWriteArrayList行为

时间:2018-12-11 11:10:13

标签: java multithreading java.util.concurrent

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

首先

  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. 此代码正确吗?

1 个答案:

答案 0 :(得分:1)

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

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

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

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