深入java虚拟机第20章, 线程同步-同步和互斥 - 日拱一卒,不求速成 - JavaE...

来源:百度文库 编辑:神马文学网 时间:2024/04/16 20:05:42

深入java虚拟机第20章, 线程同步-同步和互斥

监视器

java监视器支持两种线程:互斥和协作。

java虚拟机通过对象锁来实现互斥,允许多个线程在同一个共享数据上独 立而不干扰地工作。

协作则通过object类的wait方法和notify方法来实现,允许多个线程为了同一个目标而共同工作。

我们将监视器比作一个建筑物,里面有很多房间,房间里面有一些数据,并且同一个时间只能被一个线程占据。一个线程进入房间到离开为止,独占其中全部的数据。

进入这个数据叫做进入监视器。

进入房间叫做获得监视器。

占据房间叫做持有监视器。

离开房间叫做释放监视器。

离开建筑叫做退出监视器。

 

互斥原理

对一个监视器来说监视区域是最小的,不可分割的代码块。同一个监视器中,监视区域只会被一个线程执行。

当一个线程到达了一个监视区域的开始处,它就会放置到监视器的入口区。如果没有其他线程等待,它就会进入监视器并且获得监视器,当执行完监视区域的代码后,就会释放并退出监视器。

如果当前监视器正在被另外一个线程持有,那么它就会进入一个等待队列(如果有其他线程也在等待进入监视器)。当持有线程退出之后,只能有等待队列中的一个线程进入并持有该监视器,其他的线程仍旧留会在等待队列中。

 

协作原理

当一个线程需要一些特别的数据,而由另一个线程负责改变这些数据的状态时,同步显得特别重要。

eg,一个读线程会由一个缓冲区中读取数据,而当前这个缓存区是空的,就需要一个写线程写入数据,当写数据完成写入,读线程才能做读取操作。

java虚拟机使用的这种监视器叫做等待并唤醒监视器。

这种监视器中,一个已经持有该监视器的线程,可以通过调用等待命令,暂停自身的执行。当这个线程执行等待命令后,就会释放该监视器并进入一个等待区,并会一直在那里持续等待状态,直到一段时间后该监视器内的其他线程调用了唤醒命令。当一个线程调用唤醒命令后,它会持续持有监视器,直到它主动释放监视器。当执行了唤醒命令或者执行完监视区域,释放监视器后,等待线程会苏醒,其中的一个会重新获得监视器,判断状态条件,以便决定是否继续继续进入等待状态或者退出或者执行监视区域。