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();
}
}
}