package com.design.patterns;
/**
* 懒汉式加载 线程安全
* 1.将类构造器私有化,防止new对象
* 2.创建静态常量
* 3.提供公共获取对象的方法(同步方法),只不过需要判断类对象是否为空,如果对象为空则进行创建对象,否则直接返回
*/
public class LazyLoadDemo_ThreadSafe {
public static void main(String[] args) {
LazySafeSingleton lazyNotSafeSingleton = LazySafeSingleton.getInstance();
LazySafeSingleton lazyNotSafeSingleton2 = LazySafeSingleton.getInstance();
// 比较两个对象是否相等
System.out.println(lazyNotSafeSingleton == lazyNotSafeSingleton2);
// 查看两个对象的Hash值是否相同
System.out.println(lazyNotSafeSingleton);
System.out.println(lazyNotSafeSingleton2);
}
}
class LazySafeSingleton {
private LazySafeSingleton() {}
private static LazySafeSingleton INSTANCE = null;
public static synchronized LazySafeSingleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new LazySafeSingleton();
}
return INSTANCE;
}
}
该内部类LazySafeSingleton获取实例方法时,使用了synchronized来保证当有多个线程来获取对象时,只有一个线程可以正常执行方法,其他方法等待,所以效率很低。
[注:如果想搞懂synchronized需要学习jvm,阅读<<深入理解Java虚拟机>>]