java synchronize - 线程同步机制(转)

Java支持同步机制的是Monitor。Monitor就像是拥有一个特殊房间的建筑,在同一时间里,这间特殊的房间只能被一个线程拥有。

enter the monitor:进入这幢建筑
acquiring the monitor:进入建筑里的特殊房间
owning the monitor:拥有特殊房间的所有权
releasing the monitor:离开特殊的房间
exiting the monitor:离开这幢建筑
Monitor支持两种同步机制:

互斥:通过对象锁,使得多线程处理能互相独立的处理共享数据,而不会发生线程不安全
协作:通过对象的wait和notify方法实现,比如一个读的线程从缓冲区读数据,另一个线程负责往缓冲区写数据,如果缓冲区没有数据,则读线程阻塞,有数据时,读线程就要开始消费
wait-notify又可以称作’Singal-continue’。当线程获得 notify,这就是一个信号,线程开始拥有 monitor的所有权,能够 继续 执行 monitor region。执行完之后,此线程释放monitor,一个等待的线程则会获得一样的机会

Monitor的模型如下:

 

 

 

1 表示线程刚到达 monitor region ,即 enter the monitor
2 表示线程获取 monitor的所有权,即acquiring the monitor
3 表示线程执行了 wait,交出所有权,即releasing the monitor
4 表示原来拥有 monitor 的线程执行了 notify ,恰好被这个线程获取所有权
5 表示线程执行完了 monitor region,即exiting the monitor

Monitor特意把等待的线程分成了两个部分,Entry Set和Wait Set,Entry Set表示线程刚执行到 Monitor region,而Wait Set则是由于线程执行了wait方法而进入的区域。注意到Object的 notify 以及 notifyAll 要唤醒的对象就处于 Wait Set,换句话说,如果退出 monitor 的线程没有执行 notify/notifyAll ,那么只有 Entry Set 能够获取执行的权限 。如果执行了,则Entry Set和Wait Set中所有的线程都会竞争谁最终能够获取 monitor 的能力

一个线程要离开Wait Set,要么是原拥有 monitor 的线程执行了 notify/notifyAll,要么是wait的时间到了,JVM 会触发一个notify
————————————————
版权声明:本文为CSDN博主「爬蜥」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39687783/article/details/84494745

posted @ 2022-08-04 14:31  Mars.wang  阅读(90)  评论(0编辑  收藏  举报