要点:
1.是某个类只能有一个实例, 构造器私有化
2.是它必须自行创建这个实例,含有一个该类的静态变量来保存这个唯一的实例
3.是它必须自行向整个系统提供这个实例,对外提供获取该实例对象的方式:直接暴露、用静态变量的get方法获取
常见形式:
饿汉式:直接创建对象,不存在线程安全问题
懒汉式:延迟创建对象,用的时候创建
简单点说,就是一个应用程序中,某个类的实例对象只有一个,你没有办法去new,因为构造器是被private修饰的,一般通过getInstance()的方法来获取它们的实例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| //懒汉式-线程安全的懒汉式,可以在静态方法后面加synchronized关键字加锁变为安全 public class Singleton{ //将自身实例化对象设置为一个属性,并用static修饰 private static Singleton instance; //构造方法私有化 private Singleton(){ } //静态方法返回该实例 public static (synchronized) Singleton getInstance(){ if(instance==null){ instance=new Singleton(); } return instane; } }
//饿汉式 public class Singleton{ //直接创建对象 private static Singleton instance=new Singleton(); //构造方法私有化 private Singleton(){ } //静态方法返回该实例 public static Singleton getInstance(){ return instance; } }
//静态内部类 public class Singleton{ private static class SingletonHolder{ private static final Singleton INSTANCE=new Singleton(); } private Singleton(){ } private static final Singleton getInstance(){ return SingletonHolder.INSTANCE; } }
//枚举 public enum Singleton{ INSTANCE; public void whateverMethod(){} }
//双重校验锁 public class Singleton{ //将自身实例化对象设置为一个属性,并用static修饰 private static Singleton instance; //构造方法私有化 private Singleton(){} //静态方法返回该实例 public static Singleton getInstance(){ // 第一次检查instance是否被实例化出来,如果没有进入if块 if(instance==null){ synchronized(Singleton.class){ // 某个线程取得了类锁,实例化对象前第二次检查instance是否已经被实例化出来,如果没有,才最终实例出对象 if(instance==null){ instance=new Singleton(); } } } return instance; } }
|