package com.zfy.learn;
/*
* 单例模式
* */
public class SingleInstance {
//volatile同步变量
static volatile SingleInstance instance;
private SingleInstance(){
}
public static SingleInstance initInstance(){
/*
这里也存在先检查后执行,而且static和volitale并不能保证线程安全,但是由于下面创建对象被加锁,其他线程只能获取,无法修改instance
volatile:1、使得instance一旦在一个线程中被赋值,则会锁定lock不允许其他指令重排到该指令前,
且会将该变量的值刷入内存,并使得其他线程工作内存中的该变量值失效更新,确保该赋值对所有线程可见
2、会禁止编译后机器码部分的指令重排,保证if条件判断在前
*/
//double check
if(instance!=null)
return instance;
//这里是典型的先检查后执行,需要原子性操作的过程,用synchronized 确保原子性
synchronized (SingleInstance.class) {
if (instance == null) {
// instance = new SingleInstance();
SingleInstance newInstance = new SingleInstance();
instance = newInstance;
}
return instance;
}
}
public static void main(String[] args) {
Thread t= new Thread(
()-> System.out.println(initInstance())
);
t.start();
Thread t1= new Thread(
()-> System.out.println(initInstance())
);
t1.start();
System.out.println(initInstance());
}
}
单例模式懒汉式多线程锁定
最新推荐文章于 2024-09-23 01:00:00 发布