java – 我应该同步监听器通知吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 我应该同步监听器通知吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1565字,纯文字阅读大概需要3分钟。
内容图文
![java – 我应该同步监听器通知吗?](/upload/InfoBanner/zyjiaocheng/752/fd84d047d6e3474cbb349f86d57fb6b2.jpg)
我总是非常犹豫要把我的锁公开,让它们公开.我总是试图将锁限制在我的实现中.我相信,不这样做是一个僵局的秘诀.
我有以下课程:
class SomeClass {
protected ArrayList<Listener> mListeners = new ArrayList<Listener>();
protected void addListener(Listener listener) {
synchronized (mListeners) {
mListeners.add(listener);
}
}
protected void removeListener(Listener listener) {
synchronized (mListeners) {
mListeners.remove(listener);
}
}
...
}
当SomeClass想要通知他的听众时,你会这样做:
synchronized (mListeners) {
for (Listener l : mListeners) {
l.event();
}
}
要么
Listener[] listeners = null;
synchronized (mListeners) {
listeners = mListeners.toArray();
}
for (Listener l : listeners) {
l.event();
}
我会选择第二种选择.缺点是听众可以获得活动,即使他们已经取消注册.好处是,一个侦听器calllback正在等待的线程,当他想取消注册一个监听器时,它不会遇到死锁.我认为好处比下行更重要,可以很容易地记录下来.
所以这里的问题基本上是:你会暴露你的锁吗?
我的问题不是你选择一个简单的ArrayList,LinkedList,ConcurrentLinkedQueue,CopyOnWriteArrayList,……!您是否会介意监听器是否可以在未注册时收到通知.无论你是否将锁打开,或不是.这是关于避免死锁.
请分享你的想法.谢谢!
解决方法:
对侦听器数组使用CopyOnWriteArrayList.
这非常适合不经常更改的侦听器阵列.当您遍历它们时,您将遍历底层数组.使用CopyOnWriteArrayList,每次修改此数组时都会复制该数组.所以在迭代时不需要与它同步,因为每个底层数组都保证是静态的,甚至超过它在CopyOnWriteArrayList中的使用.
由于CopyOnWriteArrayList也是线程安全的,因此您无需同步add& amp;删除操作.
宣言:
private final CopyOnWriteArrayList<Listener> listeners;
事件触发器:
for (Listener l: this.listeners) {
l.event();
}
内容总结
以上是互联网集市为您收集整理的java – 我应该同步监听器通知吗?全部内容,希望文章能够帮你解决java – 我应该同步监听器通知吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。