我是否应该同步监听器通知?

2024-01-07

我总是很犹豫是否要把我的锁公开,公开。我总是尝试将锁限制在我的实现范围内。我相信,不这样做就会导致僵局。

我有以下课程:

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();
        }
    }

or

    Listener[] listeners = null;

    synchronized (mListeners) {
        listeners = mListeners.toArray();
    }
    for (Listener l : listeners) {
        l.event();
    }

我会选择第二个选项。缺点是监听器可以获取事件,即使它们已经未注册。好处是,等待侦听器回调的线程在想要取消注册侦听器时不会陷入死锁。我相信好处比坏处更重要,这很容易记录下来。

所以这里的问题基本上是:你会暴露你的锁吗?

我的问题不是你是否会选择一个普通的 ArrayList、一个 LinkedList、一个 ConcurrentLinkedQueue、一个 CopyOnWriteArrayList、一个...!这是您是否介意侦听器在未注册时是否可以收到通知。问题在于你是否愿意把锁打开。这是为了避免僵局,或者不是。

请分享您的想法。谢谢!


Use a CopyOnWriteArrayList对于您的侦听器数组。

这对于不经常更改的监听器数组来说是完美的。当您迭代它们时,您正在迭代底层数组。与一个CopyOnWriteArrayList,该数组每次修改时都会被复制。因此,在迭代时无需与其同步,因为每个底层数组都保证是静态的,即使在其在内部使用之后也是如此。CopyOnWriteArrayList.

Since CopyOnWriteArrayList也是线程安全的,不需要同步add和remove操作。

宣言:

private final CopyOnWriteArrayList<Listener> listeners;

事件触发:

for (Listener l: this.listeners) {
  l.event();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我是否应该同步监听器通知? 的相关文章

  • 使用 BlobOutputStream 在 Azure 中上传 blob

    我正在尝试直接从流上传 blob 因为我不知道我决定尝试的流的长度这个答案 https stackoverflow com a 24621538 3695939 这不起作用 即使它从流中读取并且不会抛出任何异常 内容也不会上传到我的容器 我
  • 我可以在 Java 枚举上使用构建器模式吗

    我正在重写一些代码 并且我已经决定了重新创建类的方法 因为有固定数量的工作表 我将它们创建为枚举 这是基于构建器模式与伸缩构造器的可读性的决定 我的代码获取一些 xls 文件 添加标题 并从其他 xls 文件中读取一些 也许还有一些子表 然
  • 将 allMatch、noneMatch 和 anyMatch 合并到单个流上

    我想要以下逻辑 我知道它不起作用 因为它多次消耗流 但我不知道如何实现它 Stream
  • 创建通用数组时出错

    public class TwoBridge implements Piece private HashSet
  • Eclipse 与 IntelliJ 热部署

    我的应用程序配置 Tomcat 8 Spring Spring MVC Hibernate 在 Eclipse 中 我创建了 Tomcat 服务器 并将我的应用程序添加到资源中 JSP JS CSS 和 JAVA 类热部署的工作原理就是这样
  • 如何访问EmbeddedSolrServer实例的管理界面?

    在我的网络应用程序中 我正在运行org apache solr client solrj embedded EmbeddedSolrServer出于调试目的 我想访问管理界面 这就是我实例化服务器的方式 new EmbeddedSolrSe
  • grails 中的 log4j:如何登录文件?

    我的 grails config groovy 中有这个 log4j 配置 log4j error org codehaus groovy grails web servlet controllers org codehaus groovy
  • 在 Java 中生成 LaTeX 输出 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有用于从 Java 生成 LaTeX 输出的 Java 库 渲染乳胶 JLatex数学 https
  • python 中的子进程调用以使用 JAVA_OPTS 调用 java jar 文件

    示例代码 import subprocess subprocess call java jar temp jar 如何在上面的命令中指定JAVA OPTS 当我使用上述命令时 我收到 java lang OutOfMemoryError 无
  • 对象映射器 - YAMLFactory - 由于缺少 _createContentReference 方法而出现异常

    我正在使用最新的 2 13 0 版本的 jackson 当我尝试解析 YAML 文件时 出现此异常 java lang NoSuchMethodError com fasterxml jackson core io ContentRefer
  • 从侦听器中修改 JFrame [重复]

    这个问题在这里已经有答案了 可能的重复 如何在框架可见后调用 setUndecorated https stackoverflow com questions 875132 how to call setundecorated after
  • java charAt() 和startsWith() 哪个更快? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我的问题是 如果我想检查特定索引中字符串的一个字符 仅检查一个字符 哪种方法非常有效charAt or startsWith 我的意思是 据我所
  • 从 Java 应用程序读取的文件是否会调用系统调用?

    我的理解是 请求文件系统路径 例如 aFile 的用户应用程序将调用文件系统并获取所请求文件的虚拟地址 然后应用程序将尝试以该地址作为参数 即作为 CPU 指令 进行读 写操作 执行读取命令时 内存管理单元会将该地址转换为物理地址 并查看页
  • 为什么从类构造函数调用的方法应该是最终的? [复制]

    这个问题在这里已经有答案了 我是一名 Java 新手 我试图理解 Oracle 网站教程中的以下行 https docs oracle com javase tutorial java IandI final html https docs
  • AWS SQS Batch SendMessageBatchRequest 非常慢

    我的应用程序使用 SendMessageBatchRequest 将每个请求发布 10 条消息到 AWS SQS 每条消息的大小小于250字节 该应用程序预计每天发布约一百万条记录 但要实现这一目标 消息发布的速度非常慢 AmazonSQS
  • Java 中的连接路径

    In Python我可以连接两条路径os path join os path join foo bar gt foo bar 我正在尝试在 Java 中实现相同的目标 而不用担心是否OS is Unix Solaris or Windows
  • 使用 Retrofit 获取原始 HTTP 响应

    我想从我的 API REST 获取原始 http 响应 我尝试过这个界面 POST login FormUrlEncoded Call
  • 在edittext android中插入imageview

    我想将 imageview 放在 edittext 中 可能吗 我检查了 evernote 应用程序 它能够将照片放在编辑文本部分 我想让我的应用程序完全相同 我如何才能将从图库中选择的图像视图放入编辑文本中 我首先尝试将 imagevie
  • 如何在 tomcat 上部署 Java Web 应用程序 (.war)?

    我有一个 warJava Web 应用程序的文件 现在我想将它上传到我的 ftp 服务器 以便我可以执行它 我应该执行哪些步骤来运行它 webapp的上下文路径是 mywebapp Edit 实际上 我的 ftp 服务器名称是ftp bil
  • RetentionPolicy CLASS 与 RUNTIME

    两者之间有什么实际区别RetentionPolicy CLASS and RetentionPolicy RUNTIME 看起来两者都被记录到字节码中 并且无论如何都可以在运行时访问 无论如何 两者都可以在运行时访问 那不是那个javado

随机推荐

  • JavaScript 图像调整大小

    有谁知道如何使用 JavaScript 按比例调整图像大小 我尝试通过添加属性来修改 DOMheight and width即时运行 但似乎在 IE6 上不起作用 要按比例修改图像 只需更改宽度 高度 CSS 属性之一 将另一个设置为自动
  • 从 Windows 命令行获取文件夹大小

    在 Windows 中 是否可以在不使用任何第三方工具的情况下从命令行获取文件夹的大小 我想要与右键单击 Windows 资源管理器 属性中的文件夹时获得的结果相同的结果 有一个内置 Windows 工具为了那个原因 dir s Folde
  • 如何避免锯齿并提高性能?

    In this 堆栈溢出答案 https stackoverflow com a 9709724 2345484事实证明 C 中的别名会降低代码速度 C 中的别名不仅适用于指针 还适用于引用 更普遍地适用于标准指定的这些类型 https s
  • ajax POST 后无法访问 JQuery $(this)?

    假设我有一堆共享点击事件的链接 a href class do stuff Click me a a href class do stuff Click me a a href class do stuff Click me a a hre
  • 使用 Utf8Json 库序列化时排除空字段?

    使用以下方法将 POCO 序列化为 JSON 字符串时 有什么方法可以忽略空字段Utf8Json图书馆 我有一个ToString我在外部使用的下面的类中的方法 所以我想看看是否有任何方法可以在进行序列化时排除空字段 基本上我不希望序列化后
  • 禁用 gcc 对不兼容选项的警告

    我很好奇是否有一个选项可以禁用 gcc 关于参数对正在编译的语言无效的警告 Ex cc1 warning command line option Wno deprecated is valid for C Java ObjC but not
  • 如何在显示 jQuery ui 选项卡时插入 JavaScript?

    我想在我的页面上运行 JavaScript 函数 但仅限于显示选项卡时 其实有两个问题 我没有使用 ajax 选项卡 那么如果我只想在显示选项卡后运行代码 我会将 JavaScript 放入 加载 或 显示 回调中吗 根据上面的答案 我的代
  • IE 和 Firefox 中的文本大小不同

    为什么 IE 中的文本比 Firefox 中的文本稍大 宽 示例 顶部是 IE 渲染文本的方式 底部是 FF Image http www dreamscape hu text jpg 在 CSS 中声明为 Arial 16px 的文本 我
  • 如何将 Xamarin Forms Shell 集成到 MvvmCross 设置中

    我打算将 Xamarin Forms 与 MvvmCross 一起使用 根据他们的tutorial https www mvvmcross com documentation tutorials tipcalc a xamarin form
  • 如何接入Kubernetes部署

    我已经创建了 Docker 映像 并部署在具有最少数量机器的 k8s 集群中 设置了一台主机和一台工作机 两台机器都已启动并运行 并使用相同的 VLAN 网络相互通信 请查找以下 Pod 和部署服务以及所描述的状态 root jenkins
  • 如何配置 protobuf-net 的 RuntimeModel.Default 以支持序列化/反序列化 SessionSecurityToken?

    BinaryFormatter 能够简单地处理序列化 private byte TokenToBytes SessionSecurityToken token if token null return null using var memo
  • XML 格式中的换行符?

    在 XML 中编辑字符串时 我需要添加换行符 我想问一下 为 android 编程时 正确的形式是什么 因为 br 有效 但 ECLIPSE 将该区域标记为有问题 如果我查看建议 Eclipse 会告诉我我应该添加一个结束标签 如果我添加换
  • Blazor 作用域 CSS 未在 Azure Pipelines 上构建

    我正在开发一个使用作用域 CSS 的 Blazor 应用程序 但是当我尝试使用 Azure Pipelines 构建它时 不会生成作用域 CSS 文件 我在一台可以通过 RDP 访问的本地计算机上构建 我看到wwwroot assembly
  • 从 mach_timebase_info() 创建结构体

    在 C 中创建时基信息结构很容易 但在 Swift 中 以下内容在 Playground 中不起作用 let timebaseInfo mach timebase info data t mach timebase info timebas
  • 使用 pandas 和 scipy 绘制树状图

    我希望使用相关性生成树状图pandas and scipy 我使用数据集 作为DataFrame 由返回组成 其大小为n x m where n是日期的数量 m公司数量 然后我只需运行脚本 import pandas as pd impor
  • 如何让 ediff + hg 在 emacs 23.2 for mac 中工作?

    我使用 emacs 二进制文件http emacsformacosx com http emacsformacosx com 当我在 Mercurial 源目录中编辑文件并运行 ediff revision 时 我得到 File the f
  • 错误:预期未定义为 GraphQL 模式

    我收到一条错误 内容为 错误 预期未定义为 GraphQL 架构 请检查一下这是什么问题 当我移动到 localhost 3000 graphiql 时 它显示上述错误 也许我犯了一些错误 请任何人检查并帮助我 如果可能的话 我的服务器 j
  • 人脸识别-Python

    我正在尝试通过以下方式进行人脸识别主成分分析 PCA 使用Python 现在我能够获得训练图像之间的最小欧几里德距离images和输入图像input image 这是我的代码 import os from PIL import Image
  • 获取正在激活的选项卡(div)的ID

    我正在使用 jquery 1 9 和 jquery UI 1 10 我希望能够在单击选项卡时获取选项卡 ID 例如 如果我单击名为 Second 的选项卡 我想获得 tabs 2 响应 到目前为止我已经完成了以下代码
  • 我是否应该同步监听器通知?

    我总是很犹豫是否要把我的锁公开 公开 我总是尝试将锁限制在我的实现范围内 我相信 不这样做就会导致僵局 我有以下课程 class SomeClass protected ArrayList