Java锁和监视器

    首先要明确的一点是监视器模型不是Java特有的,他是操作系统层次的概念,是为了实现线程同步而采取的技术手段,任何编程语言的并发设计中都可以出现这个概念。

    在Java中,每个对象和Class内部都有一个锁,Class广义上也是一个单例对象,每个对象和Class会和一个监视器关联,注意措辞,锁是存在于对象内部的数据结构,监视器是一个独立的结构但是和对象关联,相同点是对象一定有一个锁也一定关联一个监视器。另外,监视器是操控线程的,他会维持一个代码数据区和线程队列等,保证同一时刻只有一个线程访问代码数据区,监视器就是通过判断对象里锁来完成这个安全访问的功能的。监视器是比锁更高层次的抽象。具体的操作流程是:当代码进入同步区域时,找到对象关联的监视器,然后调用监视器获取锁的方法,监视器会读取对象头里面有关锁的信息作为参数,然后进行获取锁的操作,或是让当前线程得到锁,或是让当前线程等待,当代码退出同步区域时,找到对象关联的监视器,然后调用监视器释放锁的操作,整个流程大致是这个样子。另外,需要明白的是,所有代码都隶属于某个对象,非静态方法好说,静态方法是和Class对象关联的,广义上也是隶属于某个对象的。这样就能理解为什么多线程为什么能够实现同步了,因为多个线程执行同一个监视器管理的一份临界资源,自然就能处理同步的细节了。    这一点可以从Object的wait()/notify()/notifyAll()的方法可以佐证,这几个方法是线程间协作用的,而只有监视器拥有调控线程协作的能力,这就说明了每一个对象是关联了一个监视器,这几个方法可以说是监视器方法了。
    另外,Java提供了synchronized关键字和ReentrantLock类来提供线程同步功能。synchronized的使用场景就三种:       
1、修饰非静态方法,锁基于当前实例;
2、修饰静态方法,锁基于当前类Class;                                                                                                                                 
3、修饰语句块,锁基于括号里配置的实例;                                                                                                                           
需要强调的是,修饰语句块和方法的实现细节是不一样的,代码块同步使用monitorenter和monitorexit指令实现,方法同步是另外一种方式,JVM规范没有详细说明,但是方法的同步是可以通过这两个指令来实现的。

    原文作者:java锁
    原文地址: https://blog.csdn.net/tales522/article/details/80853489
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞