开发者社区> 问答> 正文

Java语言设计单例模式的特殊情况是什么?

Java语言设计单例模式的特殊情况是什么?

展开
收起
松岛菜菜 2021-10-29 14:39:58 369 0
来自:华章出版社
1 条回答
写回答
取消 提交回答
  • 单例模式的实现代码简单且高效,但还需注意一种特殊情况,在多线程应用中使用这种模式,如果实例为空,可能存在两个线程同时调用getInstance方法的情况。如果发生这种情况,第一个线程会首先使用新构造器实例化单例对象,同时第二个线程也会检查单例实例是否为空,由于第一个线程还没完成单例对象的实例化操作,所以第二个线程会发现这个实例是空的,也会开始实例化单例对象。

    上述场景看似发生概率很小,但在实例化单例对象需要较长时间的情况下,发生的可能性就足够高,这种情况往往不能忽视。

    要解决这个问题很简单,我们只需要创建一个代码块来检查实例是否空线程安全。可以通过以下两种方式来实现。

    向getInstance方法的声明中添加synchronized关键字以保证其线程安全; 用synchronized代码块包装if (instance == null)条件。在这一环境中使用synch-ronized代码块时,需要指定一个对象来提供锁,Singleton.class对象就起这种作用。

    资料来源:《Java设计模式及实践》,文章链接:https://developer.aliyun.com/article/726838

    2021-10-29 14:46:40
    赞同 展开评论 打赏
来源圈子
更多
收录在圈子:
+ 订阅
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载