public class Singleton { private static Singleton instance; private Singleton() {}; public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
首次调用时进行初始化;
synchronized加锁保证线程安全;java
public class Singleton { private static Singleton instance = new Singleton(); private Singleton() {}; public static Singleton getInstance() { return instance; } }
类加载时就实例化,避免了多线程同步问题,不须要加锁;安全
public class Singleton { 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; } }
首次调用时进行初始化;
volatile关键字保证了变量在多线程下的可见性以及防止指令重排;
经过加锁和两次校验是否实例化避免多线程屡次建立实例的问题;如:
当实例未被建立时,线程t1调用getInstance方法,第一次判断instance==null为真,继续执行,进入同步代码块。在t1建立实例以前,线程t2也调用了getInstance方法,而且因为实例还未被建立,t2一样能够经过第一个if,继续往下执行。t1建立完实例后退出同步代码块,t2进入,此时,若是没有第二个if,那么t2也会建立一个实例,可是加上第二个if,就能够避免这个多线程屡次建立实例的问题。多线程
public class Singleton { private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton() {}; public static final Singleton getInstance() { return SingletonHolder.INSTANCE; } }
利用类加载机制避免多线程同步问题;
静态内部类延迟了初始化,只有调用getInstance方法时才会加载内部类,从而实例化;线程