zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Java有序性案例

JAVA案例 有序性
2023-06-13 09:12:15 时间

Java有序性案例

代码

/**
 * @author 晓果冻
 */
public class SingleInstance {
    
    private static SingleInstance instance;
    
    private SingleInstance(){};
    
    public static SingleInstance getInstance(){
        if(instance == null){
            synchronized (SingleInstance.class){
                if(instance == null){
                    instance = new SingleInstance();
                }
            }
        }
        return instance;
    }
}

执行流程

顺序性问题点

instance = new SingleInstance();//这行代码包括如下三个步骤
  1. 分配内存空间
  2. 初始化对象
  3. 将instance引用指向内存空间。

假设执行顺序:

  1. 线程A和线程B同时进入第一个if条件判断。
  2. A线程首先获取到synchronized锁,进入代码块,此时instance为null,所以执行instance=new SingleInstance()语句。
  3. 在执行instance = new SingleInstance();时,线程A在JVM开辟一块空白的内存空间。
  4. 线程A将instance引用指向空白的内存空间,在没有进行对象初始化时,发生了线程切换,线程A释放锁。
  5. 线程B拿到锁,发现instance不为null,但此时instance并未初始化,是一个空对象。如果线程B使用instance对象,可能就会出现问题。