Java并发机制深究1-synchronized和volatile
在多线程并发编程中,synchronized和volatile都是很重要的,volatile是轻量级的synchronized。在多处理器编程中保证共享变量的统一性。
1.volatile的使用和原理
如果一个变量被声明为volatile,java线程内存模型确保所有线程中得到变量的值是一致的。
在对volatile修饰的变量进行赋值操作时会引发两个操作:
<1> 把当前处理器缓冲行中的数据写入内存;
<2> 写回内存的操作会使其他cpu中缓存的数据无效。
2.synchronized的原理
Java中的每一个对象都可以作为锁,具体表现为:
<1> 对于普通同步方法,锁是当前实例对象;
<2> 对于静态同步方法,锁是当前class对象;
<3> 对于同步代码块,锁是synchronized括号里配置的对象;
从jvm规范中可以看出synchronized的实现原理,jvm是根据monitor对象来实现的。代码块同步是根据monitorenter和monitorexit指令实现的。
monitorenter指令在编译后插入到同步代码块的开始位置,而monitorexit是插入到代码块的结束和异常处,jvm要保证monitorenter和monitorexit进行配对。当线程执行到monitorenter指令时,获取对象所对应的monitor的所有权,获得对象的锁,此时其他线程访问此对象就处于阻塞状态。当执行到monitorexit时,线程会释放掉锁。
转载于:https://www.cnblogs.com/wuyuetian/p/5498937.html
Java并发机制深究1-synchronized和volatile相关推荐
- Java并发(四)——synchronized、volatile
文章目录 synchronized.volatile 1 Java内存模型JMM 2 伪共享 3 指令重排 4 synchronized 5 volatile 6 synchronized和Lock ...
- Java并发机制的底层实现原理
Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令.本章我们将 ...
- 《Java并发编程的艺术》:第2章 Java并发机制的底层实现原理
前言 Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节 码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和 CPU的指令. ...
- 《Java并发编程的艺术》一一第2章Java并发机制的底层实现原理
第2章Java并发机制的底层实现原理 2.1 volatile的应用 Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行, ...
- java并发机制的底层实现原理(volatile,synchronized,原子操作)
目录 volatile的应用 volatile的定义与实现原理 volatile的使用优化 synchronized的实现原理与应用 Java对象头 锁的升级与对比 偏向锁 轻量级锁 锁的优缺点对比 ...
- Java并发机制底层实现原理-volatile
章节目录 volatile的实现原理与应用 1.volatile的实现原理与应用 Java source code->Java class->JVM->汇编指令->cpu执行 ...
- Java锁机制学习笔记——synchronized 和 Lock
为什么80%的码农都做不了架构师?>>> synchronized synchronized关键字相信大家都不陌生了,作为java关键字,它可以帮助我们实现对方法的加锁同步.它 ...
- Java高并发编程(二):Java并发机制的底层实现机制
Java代码在编译后会变成Java字节码,字节码在之后被类加载机制加载到JVM中,JVM执行字节码,最终需要转换为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令. ...
- Java并发(2)- synchronized与CAS
文章目录 1.引言 2.synchronized 3.synchronized的三种使用方式 4.synchronized的底层原理 5.JDK1.6对synchronized的优化 6.synchr ...
最新文章
- nginx不同server不同日志文件_招标里的答疑是什么?和澄清文件有何不同?
- 机器学习中的特征工程总结!
- HDU 6090 Rikka with Graph
- 过程 oracle 写在哪里,Oracle怎么写存储过程? 在什么地方写以及怎么调用?最好给个Sample 急(2)...
- matlab 寻找二进制图像边缘
- 一步一步实现网站的多语言版本
- 使用PLSQL客户端登录ORACLE时报ORA-12502和ORA-12545错误的解决方案
- qt中设置父窗口中某一控件样式后,子窗口中某一控件也随父控件样式
- h3c 华三路由器分类区别及命令配置笔记
- 2017/9/5的学习内容___Python装饰器的应用
- JMeter循环控制器循环次数使用变量控制注意事项
- SQL Server游标使用快速上手
- version `GLIBCXX_3.4.22‘ not found
- 珍藏多年的技术资源搜索网站——程序员必备
- 关键词作用和选择技巧
- 〔转载〕20条欠揍短消息
- tomcat 日志拆分
- 西部世界Filecoin双节点设置 大胆玩出圈
- python sklearn metrics,在Python中sklearn.metrics.mean_squared_error越大越好(否定)?
- android加载efi分区,高通Android UEFI XBL 代码流程分析