定义
某个类只能生成一个实例,该类提供了一个全局访问点,供外部获取该实例,其拓展是有限多个实例。
单例设计模式的几种实现
1.饿汉式
/**
* 饿汉式
* (无法向单例对象的构造方法传递参数)
*/
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
2.懒汉式
/**
* 懒汉式(延迟加载)
* 多线程的时候会出现问题
*/
public class Singleton {
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if (instance==null){
instance = new Singleton();
}
return instance;
}
}
3.双重检测,在framework中基本都是用的这种,但是一般都不使用volatile关键字
/**
* 双重检测
*/
public class Singleton {
//volatile 线程并发时,当变量被改动了,所有的线程都能即时访问到最新的数据
// 会屏蔽掉虚拟机的一些代码优化
private volatile static Singleton instance;
private Singleton(){}
public static Singleton getInstance() {
if (instance==null){
synchronized (Singleton.class){
if(instance==null){
instance = new Singleton();
}
}
}
return instance;
}
}
4.静态内部类
/**
* 静态内部类(不能传递参数)
* 可以延迟加载,也能线程安全
*/
public class Singleton {
private Singleton(){}
private static class SingletonHolder{
//静态内部类的静态属性实例化时,由JVM保证线程的安全
private static Singleton instance = new Singleton();
}
/**
* 只有掉用了getInstance方法之后,才会实例化 Singleton instance 属性
* @return
*/
public static Singleton getInstance(){
return SingletonHolder.instance;
}
}
5.枚举(是比较推荐的一种)
public enum Singleton {
instance;
public void operate(){
System.out.println("处理中。。。。。。");
}
}