Java单例模式的讲解

 更新时间:2019年01月07日 16:30:00   作者:李灿辉  
今天小编就为大家分享一篇关于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 中实现整句汉字拆分、转换为ASCII实例详解

    JAVA 中实现整句汉字拆分、转换为ASCII实例详解

    这篇文章主要介绍了JAVA 中实现整句汉字拆分、转换为ASCII实例详解的相关资料,需要的朋友可以参考下
    2017-04-04
  • JAVA String.valueOf()方法的用法说明

    JAVA String.valueOf()方法的用法说明

    这篇文章主要介绍了JAVA String.valueOf()方法的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • mybatis的坑-integer类型为0的数据if test失效问题

    mybatis的坑-integer类型为0的数据if test失效问题

    这篇文章主要介绍了mybatis的坑-integer类型为0的数据if test失效问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java中的ArrayList底层源码分析

    Java中的ArrayList底层源码分析

    这篇文章主要介绍了Java中的ArrayList底层源码分析,通过下标读取元素的速度很快,这是因为ArrayList底层基于数组实现,可以根据下标快速的找到内存地址,接着读取内存地址中存放的数据,需要的朋友可以参考下
    2023-12-12
  • java设计模式(实战)-责任链模式

    java设计模式(实战)-责任链模式

    这篇文章主要介绍了java设计模式(实战)-责任链模式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 计算一个Java对象占用字节数的方法

    计算一个Java对象占用字节数的方法

    这篇文章主要介绍了计算一个Java对象占用字节数的方法,较为详细的分析了Java中各类对象所占用的字节数,需要的朋友可以参考下
    2015-01-01
  • 详解Java构建树结构的公共方法

    详解Java构建树结构的公共方法

    本文主要介绍了详解Java构建树结构的公共方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Java 坐标系相互转换方式

    Java 坐标系相互转换方式

    这篇文章主要介绍了Java中的坐标系相互转换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 解读@ConfigurationProperties使用时的几个常见误区

    解读@ConfigurationProperties使用时的几个常见误区

    在Spring Boot中,@ConfigurationProperties注解用于绑定配置文件中的属性到Java对象,它支持properties和yml文件格式,并且可以通过prefix属性指定配置属性的前缀,需要注意的是,@PropertySource注解默认只支持properties文件,不支持yml文件
    2024-10-10
  • Java返回文件时为图片或pdf等设置在线预览或下载功能

    Java返回文件时为图片或pdf等设置在线预览或下载功能

    这篇文章主要介绍了Java返回文件时为图片或pdf等设置在线预览或下载功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01

最新评论