带你从底层理解java并发编程的艺术2.1重点

java并发编程的核心思想就是写后读

什么是写后读?

首先我们要知道底层是怎么运行的

cpu的一个线程进行 a++;

cpu会去内存中读取,然后在高速缓存中修改,改完之后,把数据刷新回内存。

 

星星代表cpu t1,t2,t3代表线程 每个线程在高速缓存中都有着句柄a的内存地址。右边是内存,

2.1中提到的概念:

排他:

我这个线程操作的时候不允许其他线程操作。

内存屏障:

一块内存不让被访问就是加了屏障。比如用一个变量记录值,符合值才能操作。

缓冲行:

缓存中就是最小的组成64Byte。

原子操作:

要么都成功,要么都失败。比如第九个任务失败了,就得回滚回去重新执行。

缓存填充:

把缓存放大比如java的布尔类型设置为32位。

缓存行的内容一发生变化,就需要进行缓存同步;

所以虽然用到的不是同一个数据,但是他们(数据X和数据Y)在同一个缓存行中,缓存行的内容一发生变化,就需要进行缓存同步,这个同步是需要时间的。

避免缓存同步,把数据分开放,这样就会加快传输效率

缓存命中:

去缓存查数据的时候查到了。

写命中:

内存中a=0;cpu对a执行写操作的时候,高速缓存中有a(之前用过a),数据会在缓存中修改而不用返回内存。

写缺失:

cpu在高速缓存中写操作还没刷新回内存,其他线程操作,导致内存刷新,高速缓存中的数据内存地址失效。

比如内存中a-》b-》c 在写c的时候,b指向了d 导致c被垃圾回收 cpu在高速缓存里写c后,往内存传的时候,c没了。

violatile

作用:保证可见性。

可见性就是:保证读到的数据是正确的。(能读到别人修改之后的值)

原理:

内存数据传入高速缓存中会带着自己的地址

而当前处理器高速缓存的数据写回内存后,其他cpu的该内存的地质数据讲失效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值