synchronized的作用大概分为三种:

1.确保多线程互斥的访问多线程代码。2.保证变量的可见性。3.防止指令重排序。

那么synchronized 是如何实现这些功能的。

public class SynchronizedDemo {
public void method() {
synchronized (this) {
System.out.println("Method 1 start");
}
}
}

以上面的Demo为例。对代码进行反编译。

结果如下:

关于monitorenter和monitorexit的作用,可以在jvm规范查找。

每个对象都有一个监视器(Monitor),当monitor被占用时就会被锁定,线程执行monitorenter指令就会尝试获取monitor的所有权。

获取过程如下:

1.如果monitor的进入数为0,则该线程进入该monitor,并把进入数设置为1,该线程即为monitor的所有者。

2.如果该线程已经占有该monitor,只是重新进入,则该monitor进入数 加一即可。

3.如果其他线程已经占有了该monitor,线程进入阻塞状态,直到该monitor进入数为0再重新获取。

反之monitorexit则是进入数减一了。

所以Synchronized的语义底层是通过一个monitor的对象来完成,其实wait/notify等方法也依赖于monitor对象,这就是为什么只有在同步的块或者方法中才能调用wait/notify等方法,否则会抛出java.lang.IllegalMonitorStateException的异常的原因。

最新文章

  1. win7 下配置Openssl
  2. Controlling z-order using the ZIndex Property
  3. SQL查询中关于索引使用的笔记
  4. 测算Redis处理实际生产请求的QPS/TPS
  5. Struts2 - 传值
  6. classloader加载过程
  7. socket使用TCP协议时,send、recv函数解析以及TCP连接关闭的问题
  8. 01串(dp)
  9. EF搭建可扩展菜单
  10. CSS3 贝塞尔曲线实现
  11. js generator
  12. Visual Studio 2017 for Mac
  13. Html基本操作实例代码
  14. javaweb(二十四)——jsp传统标签开发
  15. CentOS 7安装chroot Named
  16. 如何在Visual Studio中加载web load test的后缀为.ltrar的结果文件
  17. GIL、死锁与递归锁
  18. SpringMVC框架下实现分页功能
  19. Launcher3自定义壁纸旋转后拉伸无法恢复
  20. Random类、ThreadLocalRandom类

热门文章

  1. 第一次作业——MathExam285
  2. 课堂练习 psp表
  3. Alpha 冲刺报告3
  4. 利用CNN进行多分类的文档分类
  5. 通过分析java heap dump解决生产问题
  6. ORACLE LOG的管理
  7. php错误报告和调试
  8. Docker使用阿里云镜像加速
  9. [转帖] CentOS7 与 CentOS6的对比
  10. 自平衡二叉(查找树/搜索树/排序树) binary search tree