最精简:设计模式之单例模式
懒汉式(线程不安全)
public class SingletonLazy { public static void main(String[] args) { Order instance = Order.getInstance(); Order instance2 = Order.getInstance(); System.out.println(instance == instance2); } } class Order{ private Order(){ } private static Order instance = null; public static Order getInstance(){ if (instance == null) { return instance = new Order(); }else { return instance; } } }
懒汉式(线程安全)双重检测:DCL懒汉式()
public class SingletonLazy { public static void main(String[] args) { Order instance = Order.getInstance(); Order instance2 = Order.getInstance(); System.out.println(instance == instance2); } } class Order { private Order() { } private static Order instance = null; public static Order getInstance() { if (instance == null) { synchronized (Order.class) { if (instance == null) { return instance = new Order(); } } } return instance; } }
懒汉式(线程安全) DCL懒汉式在return instance = new Order();的时候如果有多线程存在的情况下会发生指令重排的情况,所有并不是绝对安全的,解决方法是在private static Order instance = null;上加上Volatile关键字
public class SingletonLazy { public static void main(String[] args) { Order instance = Order.getInstance(); Order instance2 = Order.getInstance(); System.out.println(instance == instance2); } } class Order { private Order() { } private volatile static Order instance = null; public static Order getInstance() { if (instance == null) { synchronized (Order.class) { if (instance == null) { return instance = new Order(); } } } return instance; } }
饿汉式
public class SingletonHunger { public static void main(String[] args) { Bank bank = Bank.getInstance(); Bank bank2 = Bank.getInstance(); System.out.println(bank == bank2); } } class Bank{ private Bank(){ } private static Bank instance = new Bank(); public static Bank getInstance(){ return instance; } }
下一篇:
实时美颜算法实现流程