volatile:可变的,异变的
public class T{
/*volatile*/ boolean running = true;
void m(){
system.out.println("m start");
while(running){
}
System.out.println("m end!");
}
public static void main(String[] args){
T t = new T();
new Thread(t::m,"t1").start();
try{
TimeUnit.SECONDS.sleep(1);
}catch(InterruptedException e){
e.printStackTrace();
}
t.running = false;
}
}
==
保证线程可见性
-MESI
-缓存一致性协议
禁止指令重排序(CPU)
-DCL单例
-Double Check Lock
-Mgr06.java
public class Mgr06{
private static volatile Mgr06 INSTANCE;
private Mgr06(){
}
public static Mgr06 getInstance(){
//业务逻辑代码省略
if(INSTANCE == null){
//双重检查
synchronized(Mgr06.class){
if(INSTANCE == null){
try{
Thread.sleep(1);
}catch(InterruptedException e){
e.printStatckTrace();
}
INSTANCE = new Mgr06();
}
}
}
return INSTANCE ;
}
public void m(){
System.out.println("m");
}
public static void main(String[] args){
for(int i=0;i<100;i++){
new Thread(()->{
System.out.println(Mgr06.getInstance().hashCode());
}).start();
}
}
}
本文通过分析Volatile关键字和双重检查锁定(DCL)在Java中的应用,展示了如何确保线程安全,防止指令重排序,并讨论了缓存一致性协议在保证线程可见性中的作用。
1243

被折叠的 条评论
为什么被折叠?



