1 单例设计模式
Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍两种:懒汉式单例、饿汉式单例。
1.1 特点
单例类只能有一个实例。
私有构造方法
单例类必须自己创建自己的唯一实例。
单例类必须给所有其他对象提供这一实例。
1.2 常用的单例模式写法
懒汉式单例:在第一次调用的时候实例化自己;
懒汉式1:线程不安全
public class Singleton { private Singleton() {}//私有构造行数,避免类在外部被实例化 private static Singleton single=null; //静态工厂方法 public static Singleton getInstance() { if (single == null) { single = new Singleton(); } return single; } }
懒汉式2:在getInstance方法上加同步,使得线程安全
public class Singleton { private Singleton() {}//私有构造行数,避免类在外部被实例化 private static Singleton single=null; //静态工厂方法 加上了同步,使得线程安全 public static synchronized Singleton getInstance() { if (single == null) { single = new Singleton(); } return single; } }
懒汉式3:双重检查锁定,线程安全
public class Singleton { private Singleton() {}//私有构造行数,避免类在外部被实例化 private static Singleton single=null; public static Singleton getInstance() { if (singleton == null) { synchronized (Singleton.class) {//同步锁住,使得线程安全 if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }
懒汉式4:静态内部类,线程安全。因为内部在第一次调用的时候,类只会被加载一次。
public class Singleton { private static class LazyHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){}//私有构造函数 public static final Singleton getInstance() { return LazyHolder.INSTANCE; } }
饿汉式单例:在类初始化时,已经自行实例化 线程安全
public class Singleton1 { private Singleton1() {}//私有构造函数 private static final Singleton1 single = new Singleton1(); //静态工厂方法 public static Singleton1 getInstance() { return single; } }