Java并发之Monitor实现

Java并发之Monitor实现

    可能在synchronized关键字的实现原理中,你已经知道了它的底层是使用Monitor的相关指令来实现的,但是还不清楚Monitor的具体细节。本文将让你彻底Monitor的底层实现原理

01

简介

    本文主要翻译Monitors – The Basic Idea of Java Synchronization国外大神的文章,刚兴趣的同学可以阅读一下原文。当你在学校学习操作系统课程的,你可能记得管程在操作系统中是一个同步概念。当然,管程也被用在Java同步中。本文将会使用分析陈述管程基本思想。

02

什么是管程

    一个管程可以被认为是一个带有特殊房间的建筑,这个特殊房间只能被一个线程占用。这个房间包含很多数据和代码。

Java-Monitor.jpg

    如果一个线程要占用特殊房间(也就是红色区域),那么首先它必须在Hallway中等待。调度器基于某些规则(例如先进先出)从Hallway中取一个线程。如果线程在Hallway由于某些原因被挂起,它将会被送往等待房间(也就是蓝色区域),在一段时间后被调度到特殊房间中。

java-monitor-associate-with-object.jpg

   简而言之,监视器是一种监视现场访问特殊房间的设备。他能够使有且仅有一个线程访问的受保护的代码和数据。

03

监视器如何在Java中实现

    在Java虚拟机中,每一个对象和类都与一个监视器相关联。为了实现监视器的互斥功能,锁(有时候也称为互斥体)与每一个对象和类关联。在操作系统书中,这叫做信号量,互斥锁也被称为二元信号量。

    如果一个线程拥有某些数据上的锁,其他线程想要获得锁只能等到这个线程释放锁。如果我们在进行多线程编程时总是需要编写一个信号量,那就不太方便了。幸运的是,我们不需要这样做,因为JVM会自动为我们做这件事。

    为了声明一个同步区域(这里意味着数据不可能被超过一个线程访问),Java提供了synchronized块和synchronized方法。一旦代码被synchronized关键字绑定,它就是一个监视器区域。它的锁将会在后面被JVM实现。

06

在Java同步代码中,那部分是同步监视器

    我们知道每一个对象或者是类都和监视器关联,我认为一个很好的说法是每一个对象有一个监视器,从每一个对象有自己的临界区并且能监控线程序列。

    为了协作不同的线程,Java提供了wait()和notify()来挂起一个线程和唤醒另一个在对象上等待的线程。这里有三个版本:

 

wait(long timeout, int nanos)

wait(long timeout) notified by other threads or notified by timeout.

notify(all)

    这些方法仅仅被调用在synchronized代码块和synchronized方法内。原因是,如果一个方法不需要互斥,那么就不需要在线程之间监视或协作,每个线程都可以自由地访问该方法。

往期精彩回顾

Java并发之线程

Java并发之volatile关键字

Java并发之synchronized关键字

2019_02_22_1933083452.png

点击上方二维码,关注我们

15

好看你就点点我

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值