关于一个线程获取多个锁

来源: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回答

悟空

2019-08-30

官方文档介绍monitorenter:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.monitorenter

可以看出,每个对象都与一个监视器相关联。当且仅当拥有所有者时,监视器才会被锁定。执行monitorenter的线程 尝试获取与objectref关联的监视器的所有权,如下所示:

如果与objectref关联的监视器的条目计数 为零,则线程进入监视器并将其条目计数设置为1。然后该线程是监视器的所有者。

如果线程已经拥有与objectref关联的监视器 ,它将重新进入监视器,增加其条目计数。

如果另一个线程已经拥有与objectref关联的监视器 ,则线程将阻塞,直到监视器的条目计数为零,然后再次尝试获得所有权。


所以一个线程可以同时获得不同对象的多个锁,而且每个锁都知道自己的所有者是哪个线程,每个锁都有独立的计数器。

1
2
悟空
回复
qq_小庄_1
哈哈,不敢当
2019-08-30
共2条回复

线程八大核心+Java并发原理及企业级并发解决方案

完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题

2512 学习 · 939 问题

查看课程