请教一个多线程锁的问题

2017-09-28 17:52:30 +08:00
 puritania
public class a{
    private aLock = new ReentrantLock();
  	public void test(){
      aLock.lock();
      try{
        this.test2()
      }finally{
          aLock.unlock();
      }
    }
  	public void test2(){
        ...
    }
}

多个线程持有同一个 a 对象 当一个线程调用 test 方法锁定的同时 另一个线程调用 test2 方法会阻塞吗? 我有点没明白这个锁到底算是加在哪的,如果是 synchronized 方法那肯定对象锁。 求解释

2834 次点击
所在节点    Java
13 条回复
owenliang
2017-09-28 18:19:07 +08:00
你应该读读书。
zgbgx1
2017-09-28 18:23:41 +08:00
alqaz
2017-09-28 18:33:12 +08:00
锁在 lock 和 unlock 之间。如果 test2 调用了 lock 那么就会,否则,不会
haozhang
2017-09-28 18:33:24 +08:00
不是调用 test 会锁,进入了临界区域就会锁,从 lock 开始到 unlock 结束,这片区域就是临界区域。
puritania
2017-09-28 18:38:25 +08:00
@haozhang 那此时锁的持有者算是谁呢?
misaka19000
2017-09-28 18:51:39 +08:00
Java 好像用的是 monitor 指令吧,一类是加在对象上,另一类好像是不需要加在对象上面的
sunqb
2017-09-28 19:00:37 +08:00
官方建议使用 synchronized,除非你有新的需求
domty
2017-09-28 19:18:31 +08:00
你试试写个测试不就知道了。
如果你 test2()这个方法没有对 aLock 进行加解锁操作的话,不会阻塞。
haozhang
2017-09-28 19:39:59 +08:00
@puritania 最先拿到这个锁的人
puritania
2017-09-28 19:46:24 +08:00
测试了 是不会阻塞的 看来想多了
@domty
puritania
2017-09-28 19:55:16 +08:00
misaka19000
2017-09-28 20:35:54 +08:00
反编译一下就知道是怎么回事了
ihuotui
2017-09-28 20:40:06 +08:00
aqs 高级同步队列

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/394418

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX