加入收藏 | 设为首页 | 会员中心 | 我要投稿 信阳站长网 (https://www.0376zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 评论 > 正文

volatile和synchronized到底啥区别?

发布时间:2021-02-26 17:21:16 所属栏目:评论 来源:互联网
导读:上图,每个核都有自己的一级缓存(L1 Cache),有的架构里面还有所有核共用的二级缓存(L2 Cache)。使用缓存之后,当线程要访问共享变量时,如果 L1 中存在该共享变量,就不会再逐级访问直至主内存了。所以,通过这种方式,就补上了访问内存慢的短板 具体来

上图,每个核都有自己的一级缓存(L1 Cache),有的架构里面还有所有核共用的二级缓存(L2 Cache)。使用缓存之后,当线程要访问共享变量时,如果 L1 中存在该共享变量,就不会再逐级访问直至主内存了。所以,通过这种方式,就补上了访问内存慢的短板

具体来说,线程读/写共享变量的步骤是这样:

  1.  从主内存复制共享变量到自己的工作内存
  2.  在工作内存中对变量进行处理
  3.  处理完后,将变量值更新回主内存

假设现在主内存中有共享变量 X, 其初始值为 0

线程1先访问变量 X, 套用上面的步骤就是这样:

  1.  L1 和 L2 中都没有发现变量 X,直到在主内存中找到
  2.  拷贝变量 X 到 L1 和 L2 中
  3.  在 L1 中将 X 的值修改为1,并逐层写回到主内存中

此时,在线程 1 眼中,X 的值是这样的:

 

刻,如果线程 1 再次将 x=1回写,就会覆盖线程2 x=2 的结果,同样的共享变量,线程拿到的结果却不一样(线程1眼中x=1;线程2眼中x=2),这就是共享变量内存不可见的问题。

怎么补坑呢?今天的两位主角闪亮登场,不过在说明 volatile关键字之前,我们先来说说你最熟悉的 synchronized 关键字

synchronized

遇到线程不安全的问题,习惯性的会想到用 synchronized 关键字来解决问题,暂且先不论该办法是否合理,我们来看 synchronized 关键字是怎么解决上面提到的共享变量内存可见性问题的

  •  【进入】synchronized 块的内存语义是把在 synchronized 块内使用的变量从线程的工作内存中清除,从主内存中读取
  •  【退出】synchronized 块的内存语义事把在 synchronized 块内对共享变量的修改刷新到主内存中

二话不说,无情向下看 volatile

volatile


(编辑:信阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读