JAVA封神之路-设计模式-单例模式

网友投稿 278 2022-09-20

JAVA封神之路-设计模式-单例模式

为什么要有单例模式

实际编程应用场景中,有一些对象其实我们只需要一个,比如线程池对象、缓存、系统全局配置对象等。这样可以就保证一个在全局使用的类不被频繁地创建与销毁,节省系统资源。

实现单例模式的几个要点

首先要确保全局只有一个类的实例。要保证这一点,至少类的构造器要私有化。单例的类只能自己创建自己的实例。因为,构造器私有了,但是还要有一个实例,只能自己创建咯!单例类必须能够提供自己的唯一实例给其他类就是要有一个公共的方法能返回该单例类的唯一实例。

优点:

1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。2、避免对资源的多重占用(比如写文件操作)。

缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

使用场景:

1、要求生产唯一序列号。2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。

1、饿汉式—静态常量方式(线程安全)

public class Singleton { private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; } }

类加载时就初始化实例,避免了多线程同步问题。天然线程安全。

2、懒汉式(线程不安全)

public class Singleton { private static Singleton singleton; private Singleton() {} public static Singleton getInstance() { if (singleton == null) { singleton = new Singleton(); } return singleton; }}

这是最基本的实现方式,第一次调用才初始化,实现了懒加载的特性。多线程场景下禁止使用,因为可能会产生多个对象,不再是单例。

3、懒汉式(线程安全,方法上加同步锁)

public class Singleton { private static Singleton singleton; private Singleton() {} public static synchronized Singleton getInstance() { if (singleton == null) { singleton = new Singleton(); } return singleton; }}

和上面 懒汉式(线程不安全)实现上唯一不同是:获取实例的getInstance()方法上加了同步锁。保证了多线程场景下的单例。但是效率会有所折损,不过还好。

4、双重校验锁(线程安全,效率高)

public class Singleton { private volatile static Singleton singleton; private Singleton() {} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; }}

此种实现中不用每次需要获得锁,减少了获取锁和等待的事件。注意volatile关键字的使用,保证了各线程对singleton静态实例域修改的可见性。

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

上一篇:2022年7月发布Azure AD Connect 2.1.15.0的新功能更新和问题修复列表
下一篇:UE 语言基础之代码规范
相关文章

 发表评论

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