关于一个线程获取多个锁
来源:7-4 wait释放

qq_小庄_1
2019-08-30
请问悟空老师,一个线程可以同时获得多个不同对象的锁吗?是相同对象锁根据重入性那么就在锁计数器上加1对吧。如果获得1,2两个对象锁,后面再重复获得1,2两个锁,就是在1,2两个对象锁计数器上分别加1吗?
我看过老师你的synchronize那个免费课,自己编写代码例子用到过synchronize互相嵌套而对象锁又不一样。在那上面提过相似的问题,有个同学的回答是:
同一个线程不能同时获得多个锁,同学写的嵌套同步块,根据同步锁可重入性质,object1对象锁执行到object2时,会把object1锁的指针赋给object2让它拥有同步锁,等object2代码块执行完后,会把指针重新移向object1,继续执行下面的代码,执行完后才会释放。保证单一线程安全
指针转移????希望悟空老师讲讲
1回答
-
官方文档介绍monitorenter:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.monitorenter
可以看出,每个对象都与一个监视器相关联。当且仅当拥有所有者时,监视器才会被锁定。执行monitorenter的线程 尝试获取与objectref关联的监视器的所有权,如下所示:
如果与objectref关联的监视器的条目计数 为零,则线程进入监视器并将其条目计数设置为1。然后该线程是监视器的所有者。
如果线程已经拥有与objectref关联的监视器 ,它将重新进入监视器,增加其条目计数。
如果另一个线程已经拥有与objectref关联的监视器 ,则线程将阻塞,直到监视器的条目计数为零,然后再次尝试获得所有权。
所以一个线程可以同时获得不同对象的多个锁,而且每个锁都知道自己的所有者是哪个线程,每个锁都有独立的计数器。
122019-08-30
相似问题
回答 2
回答 1