关于单利模式的几种实现方式

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 应用在启动阶段执行代码的几种方式

Python中的单例模式的几种实现方式和优化以及pyc文件解释(转)

Python实现Singleton模式的几种方式

分享下,关于负载均衡的几种部署模式

Java实现AOP的几种方式