您的浏览器过于古老 & 陈旧。为了更好的访问体验, 请 升级你的浏览器
一纸荒年 发布于2019年10月17日 15:00

原创 单例模式的几种实现方式

66 次浏览 读完需要≈ 5 分钟 Java

内容目录

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。又叫做单态模式或者单件模式,属于创建型模式。在 GOF 书中给出的定义为:保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式的目的就是要控制特定的类只产生一个对象,当然也允许在一定情况下灵活的改变对象的个数。

注意:

  • 1、单例类只能有一个实例。
  • 2、单例类必须自己创建自己的唯一实例。
  • 3、单例类必须给所有其他对象提供这一实例。

单例模式的几种实现方式

1、懒汉式

public class Singleton {  
	
	private static Singleton instance; 
	//设置为私有的构造函数 
    private Singleton (){} 
	//静态工厂方法 
    public static Singleton getInstance() {  
		if (instance == null) {  
		    synchronized (Singleton.class) {  
		        if (instance == null) {  
		            instance = new Singleton();  
		        }  
	        }  
	    }  
	    return instance;
    }  
}

这种方式采用双锁机制,安全且在多线程情况下能保持高性能。

2、饿汉式

public class Singleton {  
	
	private static Singleton instance = new Singleton(); 
	//设置为私有的构造函数 
    private Singleton (){} 
	//静态工厂方法 
    public static Singleton getInstance() {
	    return instance;
    }  
}

这种方式比较常用,一加载就产生对象,如果不使用就会造成性能浪费,它基于classloader机制避免了多线程的同步问题。

3、静态内部类

public class Singleton {

	private static class SingletonInner {  
	    private static final Singleton instance = new Singleton();  
    }
	//设置为私有的构造函数 
    private Singleton (){} 
	//静态工厂方法 
    public static Singleton getInstance() {
	    return SingletonInner.instance;
    }  
}

这种方式只适用于静态域的情况。对静态域使用延迟初始化,利用了classloader机制来保证初始化instance时只有一个线程,当Singleton类被装载后只有调用getInstance()方法,才会加载SingletonInner,从而初始化instance

4、枚举

public enum Singleton {
	INSTANCE;
}

这种方式是 Effective Java 作者 Josh Bloch 提倡的方式,enum是JDK1.5 之后加入,采纳不是很广泛,不过它不仅能避免多线程同步问题,而且还自动支持序列化机制,防止反序列化重新创建新的对象,绝对防止多次实例化,而且更简洁,明了。

  • CodePlayer技术交流群1
  • CodePlayer技术交流群2

0 条评论

撰写评论