java monitor locked_Java知识进阶-程序员应该死磕的Monitor知识点-知识铺

原标题:Java知识进阶-程序员应该死磕的Monitor知识点-知识铺

知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累。不占太多时间,不停的来唤醒你记忆深处的知识点。

一、Moniter 场景

1.1 Java 线程同步

由于多线程对资源的访问引发的可见性和原子性带来的安全问题。同步锁,互斥锁,都可以保证同一时刻只有一个线程访问。 这里用到的机制就是都是对资源的监视锁,即Monitor,每个对象都用于自己的监视锁Monitor.

1.2 对象中的锁标识

在Java 对象模型中讲到,每个对象的头部都有三部分组成:Mark Word 、Klass Word、数组长度。 每个对象的锁标识,就在 Mark Word这部分中。 如下图:

a59bfefe2aaa4794aab779c17297c827.png

1.2.1 正常: biased_lock 0 偏向锁标识 + lock 锁标识 01

1.2.2 偏向锁: biased_lock 1 偏向锁标识 + lock 锁标识 01

1.2.3 轻量级锁:ptr_to_lock_record 锁指针 + lock 锁标识 00

1.2.4 重量级锁:ptr_to_heavyweight_monitor 锁指针 + lock 锁标识 10

1.2.5 进入GC: lock 锁标识 11

二、ObjectMonitor 结构

前面讲到 java.lang.Object 类定义了 wait(),notify(),notifyAll() 方法。 这些都是 native方法,底层是C++来实现的。 这些方法的具体实现,依赖一个叫做ObjectMonitor模式实现,这是JVM内部C++实现的机制。

a882d38abd8836ac8bf91122e2ee0dc2.png

这里有几个比较重要的字段

2.1 _owner 指向持有ObjectMonitor对象的线程地址。

2.2 _WaitSet 存放调用wait方法,而进入等待状态的线程的队列。

2.3 _EntryList 这里是等待锁block状态的线程的队列。

2.4 _recursions 锁的重入次数。

2.5 _count 线程获取锁的次数。

42bc110687b0b7056f1bb6883b86994b.png

三、 Monitor 上锁 释放锁

3.1 上锁过程

3.1.1 线程获取资源对象的锁,判断 _owner是否为空。这里操作是通过 CAS操作:比较和交换(Conmpare And Swap),比较新值和旧值的不同,替换,这里会发生ABA问题,接下来文章会详细说明。

3.1.2 如果 _owner为null ,直接把其赋值,指向自己, _owner = self ,同时把重入次数 _recursions = 1, 获取锁成功。

3.1.3 如果 _self == cur 和当前线程一致,说明是重入了, _recursions++ 即可

3.1.4 线程进入对象资源,处理。 同时等待当前线程的释放信号,期间一致持有对象资源的锁。

3.2 释放锁

3.2.1 通过 ObjectMonitor::exit 退出

3.2.2 把线程插入到_EntryList中 _recursions--

3.2.3 再次从 _EntryList 中取出线程

3.2.4 调用unpark退出

具体代码,可以搜索 objectMonitor.cpp ,查看源码。返回搜狐,查看更多

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead. npm verb cli D:\JavaTools\node-v16.16.0-win-x64\node.exe D:\JavaTools\node-v16.16.0-win-x64\node_global\node_modules\npm\bin\npm-cli.js npm info using npm@9.8.0 npm info using node@v16.16.0 npm verb title npm install npm verb argv "install" "--loglevel" "verbose" npm verb logfile logs-max:10 dir:D:\JavaTools\node-v16.16.0-win-x64\node_cache\_logs\2023-07-16T03_12_06_268Z- npm verb logfile D:\JavaTools\node-v16.16.0-win-x64\node_cache\_logs\2023-07-16T03_12_06_268Z-debug-0.log npm verb shrinkwrap failed to load node_modules/.package-lock.json out of date, updated: node_modules npm verb stack Error: EBUSY: resource busy or locked, rename 'D:\vue-code\PISPlanning3\node_modules\imagemin-jpegtran\node_modules\jpegtran-bin' -> 'D:\vue-code\PISPlanning3\node_modules\.imagemin-jpegtran-PSMG5ifG\node_modules\jpegtran-bin' npm verb cwd D:\vue-code\PISPlanning3 npm verb Windows_NT 10.0.19045 npm verb node v16.16.0 npm verb npm v9.8.0 npm ERR! code EBUSY npm ERR! syscall rename npm ERR! path D:\vue-code\PISPlanning3\node_modules\imagemin-jpegtran\node_modules\jpegtran-bin npm ERR! dest D:\vue-code\PISPlanning3\node_modules\.imagemin-jpegtran-PSMG5ifG\node_modules\jpegtran-bin npm ERR! errno -4082 npm ERR! EBUSY: resource busy or locked, rename 'D:\vue-code\PISPlanning3\node_modules\imagemin-jpegtran\node_modules\jpegtran-bin' -> 'D:\vue-code\PISPlanning3\node_modules\.imagemin-jpegtran-PSMG5ifG\node_modules\jpegtran-bin' npm verb exit -4082 npm verb unfinished npm timer reify 1689477126779 npm verb unfinished npm timer reify:retireShallow 1689477127193 npm verb code -4082 npm ERR! A complete log of this run can be found in: D:\JavaTools\node-v16.16.0-win-x64\node_cache\_logs\2023-07-16T03_12_06_268Z-debug-0.log
最新发布
07-17

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值