程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了CopyOnWriteArrayList如何是线程安全的?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决CopyOnWriteArrayList如何是线程安全的??

开发过程中遇到CopyOnWriteArrayList如何是线程安全的?的问题如何解决?下面主要结合日常开发的经验,给出你关于CopyOnWriteArrayList如何是线程安全的?的解决方法建议,希望对你解决CopyOnWriteArrayList如何是线程安全的?有所启发或帮助;

如果您查看基础数组引用,您会看到它被标记为volatile。当发生写操作时(例如,在上面的摘录中),该volatile引用仅在final语句中通过进行更新setArray。到目前为止,所有读取操作都将返回数组 中的元素。

重要的一点是, ,因此读取将始终看到数组处于一致状态。

只对写操作进行锁定的优点是提高了读取的吞吐量:这是因为对a的写操作copyOnWriteArrayList可能很慢,因为它们涉及复制整个列表。

解决方法

我看过OpenJDK的OpenJDK源代码,CopyOnWriteArrayList似乎所有写操作都受同一锁保护,而读操作则根本不受保护。据我了解,在JMM下,对变量的所有访问(读和写)都应受锁保护,否则可能会发生重新排序的效果。

例如,set(int,E)method包含以下几行(处于锁定状态):

/* 1 */ int len = elements.length;
/* 2 */ Object[] newElements = Arrays.copyOf(elements,len);
/* 3 */ newElements[index] = element;
/* 4 */ setArray(newElements);

get(int)另一方面,该方法仅起作用return get(getArray(),index);

在我对JMM的理解中,这意味着get如果将语句1-4重新排序为1-2(new)-4-2(copyOf)-3 ,则可能会在不一致状态下观察到数组。

我是否对JMM理解不正确,或者是否还有其他关于为什么CopyOnWriteArrayList线程安全的解释?

大佬总结

以上是大佬教程为你收集整理的CopyOnWriteArrayList如何是线程安全的?全部内容,希望文章能够帮你解决CopyOnWriteArrayList如何是线程安全的?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: