美文网首页文字欲
Java并发那些事儿-Moniter

Java并发那些事儿-Moniter

作者: 绍圣 | 来源:发表于2019-07-04 11:34 被阅读0次

在多线程访问共享资源的时候,经常会带来可见性和原子性的安全问题。为了解决这类线程安全的问题,Java提供了同步机制、互斥锁机制,这些机制保证了在同一时刻只有一个线程能访问共享资源。这些机制的保障来源于监视锁Monitor,每个对象都拥有自己的监视锁Monitor。

Monitor是一种同步工具,也说是一种同步机制,它通常被描述为一个对象,主要特点是:对象(Monitor)的所有方法都被“互斥”的执行。好比一个Monitor只有一个运行“许可”,任一个线程进入任何一个方法都需要获得这个“许可”,离开时把许可归还。

在JVM源码中,Monitor的实现中有几个关键的属性:

_owner:指向持有ObjectMonitor对象的线程

_WaitSet:存放处于wait状态的线程队列

_EntryList:存放处于等待锁block状态的线程队列

_recursions:锁的重入次数

_count:用来记录该线程获取锁的次数

说明:当多个线程同时访问一段同步代码时,首先会进入_EntryList队列中,当某个线程获取到对象的monitor后进入_Owner区域并把monitor中的_owner变量设置为当前线程,同时monitor中的计数器_count加1。即获得对象锁。

若持有monitor的线程调用wait()方法,将释放当前持有的monitor,_owner变量恢复为null,_count自减1,同时该线程进入_WaitSet集合中等待被唤醒。

若当前线程执行完毕将释放monitor(锁)并复位变量的值,以便其他线程进入获取monitor(锁)。

在JDK1.6之前:sychronized的加锁和解锁实现会直接调用monitor的加锁和解锁方法,这种被称为重量级锁。因为Java线程是映射到操作系统原生线程上的,如果要阻塞或唤醒一个线程需要到操作系统层面(从用户态转换到核心态),状态之间的转换要花费很多的时间。

在JDK1.6之后对锁做了优化,出现了轻量级锁,偏向锁,锁消除,适应性自旋锁,锁粗化。为了在线程之间更高效的共享数据 ,解决竞争问题

获取锁流程 释放锁流程

相关文章

  • Java并发那些事儿-Moniter

    在多线程访问共享资源的时候,经常会带来可见性和原子性的安全问题。为了解决这类线程安全的问题,Java提供了同步机制...

  • Java并发那些事儿-CAS

    CAS(Compare And Swap)比较与交换:一种无锁算法。在不使用锁(没有线程被阻塞)的情况下实现多线程...

  • Java并发那些事儿序言

    JVM执行的Java代码是被转换成由字节码组成的class文件。那么JVM是如何在字节码层面上执行线程同步的? 回...

  • Java并发那些事儿-锁

    公平锁和非公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁,线程直接进入队列中排队,队列中的第一个线程才能获得锁...

  • Java并发那些事儿-Synchronized

    作为一个Java开发,在有多线程竞争同一个资源的时候,为了达到原子性。首先想到的解决方案就是使用synchroni...

  • Java并发那些事儿-对象头

    对象头信息是与对象自身定义的数据无关的额外存储成本,在对象头中有一些运行时数据,其中就包括和多线程相关的锁的信息(...

  • Java并发那些事儿-对象模型

    Java的对象模型 oop-klass model 在JVM的内存结构中,对象是保存在堆内存中,对对象的操作其实是...

  • Java并发那些事儿-优化锁

    乐观锁和悲观锁 对于同一个数据的并发操作,悲观锁认为在使用数据的时候一定会有别的线程来修改数据,因此在获取数据的时...

  • Java并发和多线程那些事儿

    我记得我接触电脑的时候是在小学三年级的时候,那是1995年,那年发布了windows95,但是我学习的时候还是只是...

  • Java并发教程

    Java并发教程 Java并发概述Java并发环境设置Java并发主要操作Java并发性线程间通信Java并发同步...

网友评论

    本文标题:Java并发那些事儿-Moniter

    本文链接:https://www.haomeiwen.com/subject/mgnfqctx.html