java多线程内存模型,jmm模型,volatile变量讲解。

1.cpu多核并发缓存架构剖析

2.java线程内存模型底层实现原理
java线程有自己工作内存,共享变量在其它线程的改变,有可能不变。
在这里插入图片描述


public class ttest {
	private static  boolean initflag=false;
	public static void main(String[] args) throws InterruptedException{
		new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println("waiting data...");
				while(!initflag) {
				}
					System.out.println("success");
			}
		}).start();
		Thread.sleep(2000);
		new Thread(new Runnable() {
			@Override
			public void run() {
				prepare();
			}
		}).start();
	}
	public static void prepare() {
		System.out.println("prepare data..");
		initflag=true;
		System.out.println("end");
	}

}

Boolean加了volatile就可以被感知到,多线程变量副本可见性。
在这里插入图片描述

public class ttest {
	private static volatile boolean initflag=false;
	public static void main(String[] args) throws InterruptedException{
		new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println("waiting data...");
				while(!initflag) {
				}
					System.out.println("success");
			}
		}).start();
		Thread.sleep(2000);
		new Thread(new Runnable() {
			@Override
			public void run() {
				prepare();
			}
		}).start();
	}
	public static void prepare() {
		System.out.println("prepare data..");
		initflag=true;
		System.out.println("end");
	}

}

从底层看
在这里插入图片描述
jmm数据原子操作
在这里插入图片描述

jmm缓存不一致问题:

总线加锁(性能低)
cpu从主内存读取数据到高速缓存,会在总线对这个数据加锁,这样其他cpu没法读写这个数据,直到cpu使用完释放加锁之后其他cpu才能读取该数据。在主内存中进行lock和unlock。
说白了就是,一个数据一个人用完了,其他人再用。
MESI缓存一致性协议
多个cpu从主内存读取一个数据到各自的高数缓存,当其中某个cou修改了缓存里的数据,数据马上同步会内存,其他cpu通过总线机制可以感知到数据的变化从而将自己的缓存中的数据失效。

volatile可见性底层实现原理:

就是缓存中的数据改变后会立即写回到系统内存,同时执行总线上的mesi时其他线程中使用这个变量的失效。并对主内存的变量加锁,直到同步的数据到了主内存,解锁再读入其他线程。
在这里插入图片描述
java程序汇编代码查看
在这里插入图片描述
3.cpu缓存一致性协议详解
4.深入汇编语言底层理解volatile关键字
5.并发编程的可见性,原子性与有序性详解。

并发编程三大特性 :可见性,原子性,有序性。
volatile保证可见性和有序性,但不能保证原子性,保证原子性需要借助synchronized这样的锁机制。
原子性多个线程的速度不同,volatile的总线嗅探机制可能会导致部分操作的失效。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谷咕咕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值