java|深入java虚拟机——多线程

《深入java虚拟机》中讲述多线程这一块,有如下描述:
“在JVM中,每个对象和类在逻辑上都是和一个监视器相关联的”“为了实现监视器的排他性监视能力,JVM为每一个对象和类都关联一个锁”
“锁住了一个对象,就是获得对象相关联的监视器”
根据我的理解,这个监视器就是锁。同步有两种情况,一种是互斥,一种是协作。
互斥可以用锁来实现。协作使用wait和notify、notify方法实现,互斥的情况比较简单,重点说一下协作。
在实现协作时,一个对象锁或者类锁应该关联两个等待区域:一个区域存放请求锁的线程(还从未获得过锁,叫入口区域),一个区域存放获得过锁但是又释放锁重新等待的线程(即调用了wait方法的线程,wait方法会释放相关联的锁,叫等待区域)。当一个线程获得锁,对共享数据进行操作时,发现这些数据不是自己想要的状态,这时释放锁让其他线程获得锁来改变数据状态以达到自己想要的状态(比如读进程获得缓冲区以后,发现缓冲区为空,这是调用wait方法释放锁)其他线程获得锁以后,改变了数据的状态时,提醒(调用notify或者notifyAll方法)等待区域的线程(调用过wait方法的线程)可以重新来尝试获得锁,但是采取什么策略以及把锁分配给入口区域还是等待区域中的哪个线程,这都跟具体的虚拟机实现相关。(可能采取先来先到策略,等待时间最长的,或者优先策略,优先级最高的,都有可能,不是我们可以决定的。)
并不是调用一个wait方法就得对应一个notify方法(但是调用wait方法的线程必须被唤醒,这样才会去竞争锁).notify方法只是唤醒等待区域中的线程,让其可以去竞争锁,可能调用很多个wait方法,只调用了一个notifyAll方法,也可能就没有notify或者notifyAll方法, wait(long timeout)可以指定经过timeout毫秒后线程自动唤醒。

    推荐阅读