单例模式的实现代码简单且高效,但还需注意一种特殊情况,在多线程应用中使用这种模式,如果实例为空,可能存在两个线程同时调用getInstance方法的情况。如果发生这种情况,第一个线程会首先使用新构造器实例化单例对象,同时第二个线程也会检查单例实例是否为空,由于第一个线程还没完成单例对象的实例化操作,所以第二个线程会发现这个实例是空的,也会开始实例化单例对象。
上述场景看似发生概率很小,但在实例化单例对象需要较长时间的情况下,发生的可能性就足够高,这种情况往往不能忽视。
要解决这个问题很简单,我们只需要创建一个代码块来检查实例是否空线程安全。可以通过以下两种方式来实现。
向getInstance方法的声明中添加synchronized关键字以保证其线程安全; 用synchronized代码块包装if (instance == null)条件。在这一环境中使用synch-ronized代码块时,需要指定一个对象来提供锁,Singleton.class对象就起这种作用。
资料来源:《Java设计模式及实践》,文章链接:https://developer.aliyun.com/article/726838
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。