关于多线程锁的获取

摘自某位大神的回复,讲的很不错

作者:beralee
链接:https://www.zhihu.com/question/19708552/answer/12719903
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

要明白两个问题,1.锁的对象是谁,2.谁持有了锁。
假设方法A和B是在同一个类Test中的两个方法。
Test t=new Test(); t.methodB();这个时候,methodB方法被调用时,因为加了synchronized ,需要先获得一个锁,这个锁的对象应该是t,也就是当前的这个Test类的实例,而获得锁的东西是线程,也就是说当前线程拿到了t的锁(而不是你说的B方法获得锁),这个时候B方法内调用methodA,
因为A也加了synchronized,
也需要获得一个锁,因为A和B都是Test类中的方法,所以当前线程要获得的锁的对象也是t。
由于当前线程在执行B方法时已经持有了t对象的锁,因此这时候调用methodA是没有任何影响的,相当于方法A上没有加synchronized。
另一种情况:假设现在有两个Test类
Test t1=new Test();
Test t2=new Test();
t1.methodB(); //此时当前线程持有了t1对象的锁
t2.methodB();//此时当前线程也持有了t2对象的锁当前线程持有了两把锁,锁的对象分别是两个不同的Test类的实例t1和t2,互相没有影响。
再一种情况:假设在多线程环境下,两个线程都可以访问
Test t=new Test(); 此时假设thread1里调用t.methodB();同时thread2里调用t.methodB()这时假设thread1先抢到t对象的锁,那么thread2需要等待thread1释放t对象的锁才可以执行B方法。结果像这样:thread1获得t的锁–thread1执行methodB–thread1执行methodA–释放t的锁—thread2获得t的锁–thread2执行methodB–thread2执行methodA–释放t的锁。synchronized还有很多种使用方法,但只有明白是那条线程获得哪个对象的锁,就很容易明白了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值