Kuangcp/JavaBase

View on GitHub
pattern/src/main/java/com/github/kuangcp/singleton/DoubleCheck.java

Summary

Maintainability
A
30 mins
Test Coverage
package com.github.kuangcp.singleton;

import lombok.Data;

/**
 * 双重校验方式  线程不安全
 * TODO 验证这个问题
 * https://blog.csdn.net/topdeveloperr/article/details/81194654
 *
 * @author kuangcp on 2019-04-11 12:41 PM
 */
@Data
public class DoubleCheck {

  private int num;

  private static DoubleCheck singleton;

  private DoubleCheck() {
  }

  public static DoubleCheck getInstance() {
    if (singleton == null) {
      synchronized (DoubleCheck.class) {
        // 因为 new 这个操作是分为三步
        // 1.分配内存空间,
        // 2.初始化对象,
        // 3.singleton 引用变量指向内存空间

        // 2,3 步可能发生指令重排序

        // 线程A执行1、3后让出cpu,此时还未执行2,别的线程拿到cpu,发现instance不为null,直接返回使用,而此时 instance还未初始化。
        if (singleton == null) {
          singleton = new DoubleCheck();
        }
      }
    }
    return singleton;
  }
}