饿汉式静态变量
public class Singleton01 { public static void main(String[] args) { Singleton instance1 = Singleton.getinstance(); Singleton instance2 = Singleton.getinstance(); System.out.println(instance1 == instance2); }}class Singleton { private Singleton() { } private final static Singleton instance = new Singleton(); public static Singleton getinstance() { return instance; }}
饿汉式静态代码块
public class Singleton02 { public static void main(String[] args) { Singleton instance1 = Singleton.getinstance(); Singleton instance2 = Singleton.getinstance(); System.out.println(instance1 == instance2); }}class Singleton { private Singleton() { } private static Singleton instance; static{ instance=new Singleton(); } public static Singleton getinstance() { return instance; }}
懒汉式(线程不安全)
public class Singleton3 { public static void main(String[] args) { Singleton instance1 = Singleton.getinstance(); Singleton instance2 = Singleton.getinstance(); System.out.println(instance1 == instance2); }}class Singleton { private Singleton (){ } private static Singleton instance; public static Singleton getinstance(){ if(instance==null){ instance=new Singleton(); } return instance; }}
懒汉式(线程安全,同步,效率低下)
public class Singleton4 { public static void main(String[] args) { Singleton instance1 = Singleton.getinstance(); Singleton instance2 = Singleton.getinstance(); System.out.println(instance1 == instance2); }}class Singleton { private Singleton (){ } private static Singleton instance; public static synchronized Singleton getinstance(){ if(instance==null){ instance=new Singleton(); } return instance; }}
双重检查(线程安全,同步)
public class Singleton5 { //双重检查(线程安全,同步) public static void main(String[] args) { Singleton instance1 = Singleton.getinstance(); Singleton instance2 = Singleton.getinstance(); System.out.println(instance1 == instance2); }}class Singleton { private Singleton(){ } //volatile保证可见性,防止指令重排 private static volatile Singleton instance; public static Singleton getinstance(){ if(instance==null){ synchronized (Singleton.class) { if(instance==null){ instance = new Singleton(); } } } return instance; }}
静态内部类
public class Singleton6 { public static void main(String[] args) { Singleton instance1 = Singleton.getinstance(); Singleton instance2 = Singleton.getinstance(); System.out.println(instance1 == instance2); }}class Singleton { private Singleton() { } //写一个静态内部类,该类有一个静态属性Instance private static class SingletonInstance { private final static Singleton Instance = new Singleton(); } public static Singleton getinstance() { return SingletonInstance.Instance; }}