博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
volatile实现原理
阅读量:5170 次
发布时间:2019-06-13

本文共 982 字,大约阅读时间需要 3 分钟。

1.CPU Cache模型

936005-20190912205208124-1475797581.png

  • 从内存中把数据读到Cache
  • 在Cache中更新数据
  • 把Cache中数据更新到内存

cpu缓存一致性问题

MESI()
  • 读操作:不做任何事情,把Cache中的数据读到寄存器

  • 写操作:发出信号通知其他的CPU将该变量的Cache line置为无效,其他的CPU要访问这个变量的时候,只能从内存中获取。

  • Cache line CPU的cache中会增加很多的Cache line

2. JMM模型

936005-20190912205233257-395468642.png

  • 主内存数据所有线程都可以访问(共享变量)
  • 每个线程都有自己的工作空间(本地内存)
  • 工作空间:局部变量、主内存的副本
  • 线程不能直接修改主内存的数据,只能将数据读到工作空间,修改完刷新到主内存

3. volatile关键字的语义分析

1. 保证可见性

对共享变量的修改,可以让其他线程感知到。

不能保证原子性。

保证可见性的原理:

使用lock锁;

当某个线程将volatile修饰的变量改变的时候,会将该变量的Cache line置为失效;

其他线程感知到Cache Line失效,会重新去主存获取该变量。

lock是汇编中的指令;

Cache line是硬件中的指令。

2. 保证有序性

重排序:

编译阶段、cpu指令优化阶段;

代码顺序并不是实际的执行顺序。

volatile的规则:
  • volatile修饰的变量位置不变
  • (即volatile前的代码不能放到volatile之后,volatile后的代码不能放到volatile之前)
保证有序性的原理:

加了轻量锁Lock

4. volatile与synchronized的区别

使用上的区别

volatile只能修饰变量,synchronized只能修饰方法和代码块

对原子性的保证

volatile不能保证原子性,synchronized可以保证原子性

对可见性的保证

都可以保证可见性

volatile使用lock锁(轻量锁),synchronized使用monitorEnter和monitorexit monitor JVM

对有序性的保证

都能保证有序性,synchronized使代码变成串行化

其他

volatile不会阻塞

synchronized会引起阻塞

转载于:https://www.cnblogs.com/zhangqirong/p/11515128.html

你可能感兴趣的文章
Nginx优化 突破十万并发
查看>>
ABP模块系统
查看>>
dfs 队列
查看>>
LeetCode 617. 合并二叉树(Merge Two Binary Trees)
查看>>
LeetCode 141. 环形链表(Linked List Cycle) 19
查看>>
css布局在IE和FF中居中
查看>>
-webkit-filter
查看>>
【SSH进阶】java.lang.IllegalArgumentException: id to load is required for loading
查看>>
asp 读取 json 数据
查看>>
Bootstrap 引用的标准模板
查看>>
Java类型信息
查看>>
UVA 10534
查看>>
Linux:写一个简单的服务器
查看>>
Android内存泄漏分析实战
查看>>
CodeForces 746D Green and Black Tea 有坑
查看>>
CDOJ--1012
查看>>
CentOS出错You don't have permission to access on this server
查看>>
HTML5 Web Storage -- 让Cookies看起来如此古老
查看>>
二维码扫描效果
查看>>
python3与mysql交互
查看>>