- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我查看了 OpenJDK source code的CopyOnWriteArrayList
似乎所有写操作都受到同一个锁的保护,而读操作则根本不 protected 。据我了解,在 JMM 下,对变量的所有访问(读和写)都应该受到锁的保护,否则可能会发生重新排序效应。
例如,set(int, E)
方法包含这些行(处于锁定状态):
/* 1 */ int len = elements.length;
/* 2 */ Object[] newElements = Arrays.copyOf(elements, len);
/* 3 */ newElements[index] = element;
/* 4 */ setArray(newElements);
另一方面,get(int)
方法仅返回 get(getArray(), index);
。
根据我对 JMM 的理解,这意味着如果语句 1-4 像 1-2(new)-4-2(copyOf)-3 那样重新排序,get
可能会观察到处于不一致状态的数组。
我对 JMM 的理解是否错误,或者对于为什么 CopyOnWriteArrayList
是线程安全的还有其他解释吗?
最佳答案
如果您查看底层数组引用,您会发现它被标记为 volatile
。当发生写入操作时(例如在上面的摘录中),此 volatile
引用仅在最终语句中通过setArray
更新。到目前为止,任何读取操作都将从数组的旧副本返回元素。
重要的是,数组更新是一个原子操作,因此读取将始终看到数组处于一致状态。
仅对写入操作获取锁定的优点是提高读取吞吐量:这是因为 CopyOnWriteArrayList
的写入操作可能会非常慢,因为它们涉及复制整个列表。
关于java - CopyOnWriteArrayList 如何是线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60412355/
简述 选中类,执行Ctrl + alt + U 查看类的继承示意图如下: public class CopyOnWriteArrayList implements List, RandomAc
我目前正在使用 ExecutorService 在 CopyOnWrite ArrayLists 中发送批处理字符串以进行并行处理,其中处理这些列表的 Runnable 任务需要遍历列表并对每个字符串
我正在使用一个集合 CopyOnWriteArrayList myCOW = new CopyOnWriteArrayList(); 其中 X 是一个可变对象。我从 Java Concurr
许多列表实现都有一个选项来指定集合的初始容量,为什么 CopyOnWriteArrayList 不允许这样做? 最佳答案 在传统的ArrayList中,容量是在后备数组中保留更多空间的提示,以便稍
根据 CopyOnWriteArrayList JavaDoc: A thread-safe variant of java.util.ArrayList in which all mutative
可能很简单,但我自己无法弄清楚。我有一些 Spring Boot WebSockets 实现示例,并且想要显示总 Activity session 。所以我创建了@Scheduled activeSe
我有以下案例, public class Test { private static final int MAX_NUMBER = 10_00_00; public static vo
这个问题已经有答案了: In what situations is the CopyOnWriteArrayList suitable? [duplicate] (2 个回答) 已关闭 5 年前。 我
我从一些教程中理解了这个概念,只要我知道一个线程何时迭代列表,就允许其他线程修改底层列表,我们不会得到 ConcurrentModificationException(CME),但在 ArrayLis
CopyOnWriteArrayList 被标记为可序列化。但它的内部状态是短暂的。任何人都可以回答我们试图在这种类型的列表中序列化什么。 /** The array, accessed only v
根据 CopyOnWritearrayList 的 javadoc : A thread-safe variant of ArrayList in which all mutative operati
我想使用可以被多线程代码不断访问的数据结构。请让我知道 java 中的任何数据结构,我可以在其中等待并使用通知选项。请看下面的代码,为什么CDRemove的run方法不打印所有值 public cla
我需要将一些对象存储到数据库中。 首先 我将它们存储在内存中(存储在集合中) 当其中一个正确存储在数据库中时,我会将其删除 所以, public class AuditService { pr
我试图将 CopyOnWriteArrayList 理解为我的代码: 我的代码是: public class AuditService { private CopyOnWriteArrayLi
我正在为 OCP 考试做一些练习。目前,我尝试打印 CopyOnWriteArrayList 的内容当使用多个线程时。根据文档,CopyOnWriteArrayList 的迭代器将 print the
拥有一个映射,按类型作为键保存同一事件的事件监听器列表, func_1() 将开始从映射中获取一种类型的监听器列表,并迭代该列表以处理每个监听器的事件。 当一个监听器完成处理后,它会要求将其从 map
我查看了 OpenJDK source code的CopyOnWriteArrayList似乎所有写操作都受到同一个锁的保护,而读操作则根本不 protected 。据我了解,在 JMM 下,对变量的
我想在内部了解并发修改异常是如何在并发集合中处理的,例如 ConcurrentHashMap 和 CopyOnWriteArrayList。 网上有很多博客建议使用这两种数据结构来避免并发修改异常。但
CopyOnWriteArrayList 的 Javadocs 说 A thread-safe variant of ArrayList in which all mutative operation
我查看了 OpenJDK source code的 CopyOnWriteArrayList似乎所有的写操作都受到同一个锁的保护,而读操作根本不 protected 。据我了解,在 JMM 下,对变量
我是一名优秀的程序员,十分优秀!