您好,登录后才能下订单哦!
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个不同的类,一个类加载器会有一个类。
通过类目进行全局访问:单例对象是通过类名获取的。初看起来,这是一个访问它的很简单的方式,但却不是很灵活。如果我们需要替换单例类,那么代码中所有引用的地方都需要修改。
看完上述内容,你们掌握Java单例模式的原理是什么的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。