您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

单例类方法的并发调用

单例类方法的并发调用

您的getSingleton()方法正在尝试延迟初始化 SINGLETON实例,但存在以下问题:

因此竞争条件AMY会导致创建两个实例。

最好和最简单的方法是安全地懒惰地初始化一个单例 而不 同步,如下所示:

这是线程安全的,因为java类加载器的约定是所有类在使用之前都必须完成其静态初始化。同样,类加载器在被引用之前不会加载类。如果getSingleton()同时调用两个线程,则Holder该类仍将仅加载一次,因此new Singleton()将仅执行一次。

这仍然是懒惰的,因为Holder类是 从引用getSingleton()方法,所以Holder在第一次呼叫时类只会被加载getSingleton()而成。

不需要同步,因为此代码依赖于类加载器的内部同步,这是防弹的。

代码模式是单例飞行的唯一方法。它是:

另一种类似的代码模式(既安全又快速)是在enum单个实例中使用,但是我发现这样做很笨拙,目的并不明确。

其他 2022/1/1 18:26:01 有480人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶