Java单例模式的讲解

网友投稿 219 2023-01-15


Java单例模式的讲解

1,单例模式的要素

1)私有构造方法。

2)public static synchronized的getInstance()方法。

上述2个要素虽然可以保证单例模式的实现,但并不是最好的方式。因为当我们讨论性能时,synchronized方法有着非常昂贵的代价。

2,多线程使用环境下的线程安全实现方式

a)使用double locking机制的懒初始化。代码如下。在这种情况下,当调用getInstance方法时,才会创建单例对象。

b)使用静态属性的早初始化。代码如下。下面的实现方式,当类被加载时,单例对象就会创建。因为单例对象是静态的。类只会被加载一次,保证了单例对象的唯一性。

3,protected 的构造函数

有时候,为了能够继承单例类,我们可以使用protected的构造函数。但是,这样会有2个缺点,让单例继承不实用。

第一点,如果构造函数是protected的,这意味着单例类可以被相同包下另一个类通过调用构造函数的方式来创建。一个可以避免这种情况的解决方法是,把单例类放在一个单独的包里。

第二点,为了能够使用继承类,代码中所有已经调用Singleton.getInstance方法的地方,都需要修改为DerivedSingleton.getInstance方法。

4,使用不同类加载器的情景

如果一个类被2个类加载器加载了,那么,在内存里,它们是2个不同的类。

5,序列化

如果一个单例类实现了Serializable接口,当单例序列化,然后多次反序列化时,将会有多个对象被创建。

热点:

多线程:如果单例需要在多线程环境下使用,应该要特别留心。

序列化:当单例类实现了Serializable接口时,它必须重写readResolve方法来避免出现2个对象。

类加载器:如果单例类被2个不同的类加载器加载,那么我们会有2个不同的类,一个类加载器会有一个类。

通过类目进行全局访问:单例对象是通过类名获取的。初看起来,这是一个访问它的很简单的方式,但却不是很灵活。如果我们需要替换单例类,oDBCqad那么代码中所有引oDBCqad用的地方都需要修改。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:详解Guava Cache本地缓存在Spring Boot应用中的实践
下一篇:研发管理平台开源框架(开源软件开发平台)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~