首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java并发: CopyOnWriteArrayList行为

Java并发: CopyOnWriteArrayList行为
EN

Stack Overflow用户
提问于 2018-12-11 11:10:13
回答 1查看 45关注 0票数 1

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

首先,

  1. 我将它们存储在内存中(存储在一个集合中)
  2. 当其中一个正确地存储在数据库中时,我将其删除。

所以,

代码语言:javascript
复制
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. 这个代码正确吗?
EN

回答 1

Stack Overflow用户

发布于 2018-12-11 11:24:54

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

但是,您的代码没有什么意义,因为copyWrite字段不在flush()方法之外被访问。本地方法变量是线程安全的,因此可以将代码简化为:

代码语言:javascript
复制
public void flush(Audit... audits) {
    for (Audit a : audits) {
        // save audit object on database
    }
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53722866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档