懒汉式单例模式

  1. /**
  2. * 懒汉式单例模式
  3. */
  4. public class LazySingleton {
  5. /**
  6. * lazySingleton = new LazySingleton()这一行代码实际上是分三步执行的,伪代码如下:
  7. * 1.分配内存空间 memory = allocate()
  8. * 2.初始化对象 instance(memory)
  9. * 3.设置instance指向刚分配的内存地址,instance = memory,此时instance != null
  10. * 步骤2和步骤3之间并不存在数据依赖关系,而且无论重排前后程序的执行结果并未改变,因此这种重排优化是允许的
  11. * 所以要使用volatile修饰是为了避免出现指定重排
  12. */
  13. private static volatile LazySingleton lazySingleton;
  14. private LazySingleton() {
  15. }
  16. public static LazySingleton getInstance() {
  17. //phase1:判断是否创建过实例
  18. if (lazySingleton == null) {
  19. //phase2:加锁
  20. synchronized (LazySingleton.class) {
  21. //phase3:双重检测锁,再次判断是否创建过实例
  22. if (lazySingleton == null) {
  23. lazySingleton = new LazySingleton();
  24. }
  25. }
  26. }
  27. return lazySingleton;
  28. }
  29. }