java – 线程安全的CopyOnWriteArrayList反向迭代
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 线程安全的CopyOnWriteArrayList反向迭代,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1993字,纯文字阅读大概需要3分钟。
内容图文
![java – 线程安全的CopyOnWriteArrayList反向迭代](/upload/InfoBanner/zyjiaocheng/820/4df4921b2d4e4a07a412104876a9b419.jpg)
请考虑以下代码段:
private List<Listener<E>> listenerList = new CopyOnWriteArrayList<Listener<E>>();
public void addListener(Listener<E> listener) {
if (listener != null) {
listenerList.add(listener);
}
}
public void removeListener(Listener<E> listener) {
if (listener != null) {
listenerList.remove(listener);
}
}
protected final void fireChangedForward(Event<E> event) {
for (Listener<E> listener : listenerList) {
listener.changed(event);
}
}
protected final void fireChangedReversed(Event<E> event) {
final ListIterator<Listener<E>> li = listenerList.listIterator(listenerList.size());
while (li.hasPrevious()) {
li.previous().changed(event);
}
}
有一个可以修改和迭代的监听器列表.
我认为前向迭代(见方法#fireChangedForward)
应该是安全的.
问题是:反向迭代(参见方法#fireChangedReversed)在多线程环境中也是安全的吗?
我对此表示怀疑,因为涉及两个电话:#size和#listIterator.
如果它不是线程安全的,那么在以下情况下实现#fireChangedReversed的最有效方法是什么:
>优化遍历
>尽可能避免使用锁定
>避免使用javax.swing.event.EventListenerList
>更喜欢不使用第三方库的解决方案,例如可以在自己的代码中实现
解决方法:
实际上,listenerList.listIterator(listenerList.size())不是线程安全的,完全是你建议的原因:列表可以改变对size()和listIterator()的调用之间的大小,导致省略元素从迭代,或抛出IndexOutOfBoundsException.
处理此问题的最佳方法是在获取迭代器之前克隆CopyOnWriteArrayList:
CopyOnWriteArrayList<Listener<E>> listenerList = ... ;
@SuppressWarnings("unchecked")
List<Listener<E>> copy = (List<Listener<E>>)listenerList.clone();
ListIterator<Listener<E>> li = copy.listIterator(copy.size());
克隆生成列表的浅表副本.特别是,克隆与原始数据共享内部数组.这在说明书中并不完全明显,仅仅说明了
Returns a shallow copy of this list. (The elements themselves are not copied.)
(当我读到这篇文章时,我想“当然没有复制元素;这是一个浅层副本!”这实际上意味着元素和包含它们的数组都不会被复制.)
这是相当不方便的,包括缺少clone()的协变覆盖,需要未经检查的强制转换.
在JDK-6821196和JDK-8149509中讨论了一些潜在的增强功能.前一个bug也链接到并发兴趣邮件列表中此问题的discussion.
内容总结
以上是互联网集市为您收集整理的java – 线程安全的CopyOnWriteArrayList反向迭代全部内容,希望文章能够帮你解决java – 线程安全的CopyOnWriteArrayList反向迭代所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。