关于单利模式的几种实现方式
Posted junehozhao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于单利模式的几种实现方式相关的知识,希望对你有一定的参考价值。
单例模式是java中非常常见的一种设计模式,也是java学习中很热门的一个知识模块,今天就和大家一起来了解一下单例模式和单例模式的几种实现方式。
单例模式的定义:
单例模式是指某个类只有一个实例,并且可以向整个系统提供这个可以自行实例化的实例。单例模式的特点是:只有一个实例、必须自己创建这个实例、必须给其他所有对象提供这个实例。单例模式,是为了确保全局对象的唯一性。
话不多说,接下来就看一下几种实现方式:
1、饿汉式
public class Singleton{ private Singleton(){} private static Singleton single = new Singleton(); public static Singleton getInstance(){ return single; } }
饿汉式在类初始化时就创建了一个静态对象可以被外部访问,这个对象不会被改变,所以是线程安全的;
2、懒汉式
public class Singleton{ private Singleton(){} private static Singleton single = null; public static Singleton getInstance(){ if(single == null){ single = new Singleton(); } return single; } }
单线程环境下没有什么问题,但是在多线程时,会产生多个single对象,所以不是线程安全的;此时,我们可以通过synchronized同步锁来解决这个问题,如下:
public class Singleton{ private Singleton(){} private static Singleton single = null; public static Singleton getInstance(){ synchronized(Singleton.class){ if(single == null){ single = new Singleton(); } return single; } } }
通过加锁,保证了只有一个实例对象,但是,带来的问题就是:效率低下,因为下一个线程如果想要获取对象,就要等待上一个线程把锁释放掉才可以继续运行;这时,可以通过双重校验锁来优化,提高效率,代码如下:
public class Singleton{ private Singleton(){} private static Singleton single = null; public static Singleton getInstance(){ if(single == null){ synchronized(Singleton.class){ if(single == null){ single = new Singleton(); } } } return single; } }
3、静态内部类实现
public class Singleton{ private Singleton(){} private static class InnerObject(){ private static Singleton single = new Singleton(); } public static Singleton getInstance(){ return InnerObject.single; } }
静态内部类是线程安全的,但是,如果遇到序列化对象,那么,就是多例的了。
4、静态代码块实现
public class Singleton{ private Singleton(){} private static Singleton single = null; static{ single = new Singleton(); } public static Singleton getInstance(){ return single; } }
5、内部枚举类实现
public class SingletonEnum(){ private enum EnumSingleton{ Singleton; private Singleton single; private EnumSingleton(){ single = new Singleton(); } public Singleton getInstance(){ return single; } } public static Singleton getInstance(){ return EnumSingleton.Singleton.getInstance(); } } class Singleton(){ public Singleton(){} }
以上就是单例模式的几种实现方式,希望大家可以通多代码,对单例模式有一定的了解,更深入的去了解的话,还需要自己更多的努力。不管是在以后的学习还是工作中,都是有不小的用处的。
生活不易,请你努力。
以上是关于关于单利模式的几种实现方式的主要内容,如果未能解决你的问题,请参考以下文章
一张图帮你记忆,Spring Boot 应用在启动阶段执行代码的几种方式