在多线程并发编程中,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相关推荐

  1. Java并发(四)——synchronized、volatile

    文章目录 synchronized.volatile 1 Java内存模型JMM 2 伪共享 3 指令重排 4 synchronized 5 volatile 6 synchronized和Lock ...

  2. Java并发机制的底层实现原理

    Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令.本章我们将 ...

  3. 《Java并发编程的艺术》:第2章 Java并发机制的底层实现原理

    前言 Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节 码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和 CPU的指令. ...

  4. 《Java并发编程的艺术》一一第2章Java并发机制的底层实现原理

    第2章Java并发机制的底层实现原理 2.1 volatile的应用 Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行, ...

  5. java并发机制的底层实现原理(volatile,synchronized,原子操作)

    目录 volatile的应用 volatile的定义与实现原理 volatile的使用优化 synchronized的实现原理与应用 Java对象头 锁的升级与对比 偏向锁 轻量级锁 锁的优缺点对比 ...

  6. Java并发机制底层实现原理-volatile

    章节目录 volatile的实现原理与应用 1.volatile的实现原理与应用 Java source code->Java class->JVM->汇编指令->cpu执行 ...

  7. Java锁机制学习笔记——synchronized 和 Lock

    为什么80%的码农都做不了架构师?>>>    synchronized synchronized关键字相信大家都不陌生了,作为java关键字,它可以帮助我们实现对方法的加锁同步.它 ...

  8. Java高并发编程(二):Java并发机制的底层实现机制

    Java代码在编译后会变成Java字节码,字节码在之后被类加载机制加载到JVM中,JVM执行字节码,最终需要转换为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令. ...

  9. Java并发(2)- synchronized与CAS

    文章目录 1.引言 2.synchronized 3.synchronized的三种使用方式 4.synchronized的底层原理 5.JDK1.6对synchronized的优化 6.synchr ...

最新文章

  1. nginx不同server不同日志文件_招标里的答疑是什么?和澄清文件有何不同?
  2. 机器学习中的特征工程总结!
  3. HDU 6090 Rikka with Graph
  4. 过程 oracle 写在哪里,Oracle怎么写存储过程? 在什么地方写以及怎么调用?最好给个Sample 急(2)...
  5. matlab 寻找二进制图像边缘
  6. 一步一步实现网站的多语言版本
  7. 使用PLSQL客户端登录ORACLE时报ORA-12502和ORA-12545错误的解决方案
  8. qt中设置父窗口中某一控件样式后,子窗口中某一控件也随父控件样式
  9. h3c 华三路由器分类区别及命令配置笔记
  10. 2017/9/5的学习内容___Python装饰器的应用
  11. JMeter循环控制器循环次数使用变量控制注意事项
  12. SQL Server游标使用快速上手
  13. version `GLIBCXX_3.4.22‘ not found
  14. 珍藏多年的技术资源搜索网站——程序员必备
  15. 关键词作用和选择技巧
  16. 〔转载〕20条欠揍短消息
  17. tomcat 日志拆分
  18. 西部世界Filecoin双节点设置 大胆玩出圈
  19. python sklearn metrics,在Python中sklearn.metrics.mean_squared_error越大越好(否定)?
  20. android加载efi分区,高通Android UEFI XBL 代码流程分析

热门文章

  1. spring管理hibernate的SessionFactory-多种配置方法
  2. Android中启动Activity(startActivity)流程图分析
  3. 教你搞定Android自定义ViewGroup
  4. poj 2516 最小费用最大流
  5. 嵌入式处理器的体系架构与内核详解
  6. java:迭代器Iterator
  7. springmvc十三:REST风格增删改查
  8. 信息系统定级与备案工作介绍
  9. Spring Task定时任务的配置和使用详解
  10. Oracle 监听器日志配置与管理