jvm
是java虚拟机用于解释,编译执行java代码,jvm可以再不同的操作系统上执行并且提供了内存管理,垃圾回收等
jmm
是java中多线程对于内存共享的行为规范,规定了在多线程环境下如何正确的使用共享变量,jmm定义了变量的可见性,原子性和有序性等特征,
public class VolatileThread extends Thread{
public boolean isflag=true;
//public volatile boolean isflag=true;
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"子线程开始执行...");
while (isflag) {
}
System.out.println(Thread.currentThread().getName()+"子线程执行结束...");
}
public void setRuning(boolean isflag)
{
System.out.println("修改值");
this.isflag = isflag;
}
}
public class ThreadVolatile {
public static void main(String[] args) throws InterruptedException {
//实例化
VolatileThread volatileThread=new VolatileThread();
//启动线程
volatileThread.start();
Thread.sleep(3000);
//睡眠3s后,main线程调用修改状态的方法
volatileThread.setRuning(false);
}
}
该数据会马上同步回主内存
,其他cpu会通过总线嗅探机制
可以感知到数据的变化,从而改变自己工作区间的数据硬件机制
,用于实现多个cpu共享数据的一致性
,当一个cpu修改了数据并将其写入到了主内存中,其他cpu通过监听
总线上的数据传输,可以感知到数据的变化。多个cpu从主内存读取同一个数据到各自高速缓存当其中的某个cpu修改了数据该数据会马上同步回主内存
,其他cpu会通过总线嗅探机制
可以感知到数据的变化,从而改变自己工作区间的数据思考:为什么线程2修改了数据,线程1会知道,并同步数据,其过程是什么样子的?
因为总线嗅探机制
存在多个cpu去监控数据总线,当线程2修改数据经过数据总线的时候,被监控到了,其他cpu发现自己的工作空间也有isflag这个变量,就会失效
,当use使用的时候,发现失效了,找不到了就会重新去主内存加载,这就是数据同步使用volatile的时候会加lock,在底层加上了lock的话就不会进行充排序了,这样就实现了顺序一致性(预计以后会写这个详细的)