加入收藏 | 设为首页 | 会员中心 | 我要投稿 南昌站长网 (https://www.0791zz.cn/)- 终端安全、安全管理、数据治理、图像分析、大数据!
当前位置: 首页 > 站长资讯 > 评论 > 正文

数据分析的主要趋势

发布时间:2021-01-30 12:05:51 所属栏目:评论 来源:互联网
导读:可以看到 ObjectMonitor 的数据结构中包含:_owner、_WaitSet 和_EntryList。 它们之间的关系转换如下: 当多个线程同时访问同一段代码块或者某个同步方法的时候,这些线程会首先被放进_EntryList 队列中,处于 blocked 状态的线程,都会放入该队列中。 当某

可以看到 ObjectMonitor 的数据结构中包含:_owner、_WaitSet 和_EntryList。

它们之间的关系转换如下:

  1. 当多个线程同时访问同一段代码块或者某个同步方法的时候,这些线程会首先被放进_EntryList 队列中,处于 blocked 状态的线程,都会放入该队列中。
  2. 当某个线程获取到对象的 Monitor 时,此时就就可以进入 running 状态,执行代码逻辑,此时,ObjectMonitor 对象的_owner 指向当前线程,_count 加 1 表示当前对象锁被一个线程获取。而没有获取到锁的线程,会再次进入_EntryList 被挂起。
  3. 当 running 状态的线程调用 wait()方法,当前线程就会释放 Monitor 对象,进入 waiting 状态,ObjectMonitor 对象的_owner 变为 null,_count 减 1,同时线程进入_WaitSet 队列,直到有线程调用 notify()方法唤醒该线程,则该线程再次进入_EntryList 队列,直到再次竞争到锁再进入_owner 区。
  4. 如果当前线程执行完毕,那么也释放 monitor 对象,ObjectMonitor 对象的_owner 变为 null,_count 减 1。

这个过程大致就是在 JDK6 之前 实现的原理。

但是,JDK6 之前,synchronized关键字的效率是非常低的。

原因如下:

Monitor 对象是依靠底层操作系统的 Mutex Lock 来实现互斥的,线程申请 Mutex 成功,则持有该 Mutex,其它线程将无法获取到该 Mutex。

既然 Mutex Lock 涉及到底层操作系统,那这个时候就存在操作系统用户态和核心态的转换,这种切换会消耗大量的系统资源,因为用户态与内核态都有各自专用的内存空间,专用的寄存器等,用户态切换至内核态需要传递给许多变量、参数给内核,内核也需要保护好用户态在切换时的一些寄存器值、变量等。

所以,在JDK 6 之后,从Jvm层面进行了优化,分为了偏向锁,轻量级锁,自旋锁,重量级锁。

五、锁升级

下面就依此来说锁是如何一步步升级的。

5.1、偏向锁

1、什么是偏向锁?

HotSpot作者经过研究实践发现,在大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得锁的代价更低,引进了偏向锁。

偏向锁的“偏”,就是偏心的“偏”,它的意思是这个锁会偏向于第一个获得它的线程,会在对象头存储锁偏向的线程ID,以后该线程进入和退出同步块时只需要检查是否为偏向锁、锁标志位以及ThreadID即可。

(编辑:南昌站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读