puritania
V2EX  ›  Java

请教一个多线程锁的问题

  •  
  •   puritania · Sep 28, 2017 · 3706 views
    This topic created in 3324 days ago, the information mentioned may be changed or developed.
    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 方法那肯定对象锁。 求解释

    13 replies  •  2017-09-28 20:40:06 +08:00
    owenliang
    owenliang
    Sep 28, 2017❤️2
    1
    你应该读读书。
    alqaz
    alqaz
    Sep 28, 2017 via Android
    3
    锁在 lock 和 unlock 之间。如果 test2 调用了 lock 那么就会,否则,不会
    haozhang
    haozhang
    Sep 28, 2017 via iPhone❤️1
    4
    不是调用 test 会锁,进入了临界区域就会锁,从 lock 开始到 unlock 结束,这片区域就是临界区域。
    puritania
    puritania
    OP
    Sep 28, 2017
    5
    @haozhang 那此时锁的持有者算是谁呢?
    misaka19000
    misaka19000
    Sep 28, 2017 via Android
    6
    Java 好像用的是 monitor 指令吧,一类是加在对象上,另一类好像是不需要加在对象上面的
    sunqb
    sunqb
    Sep 28, 2017 via Android
    7
    官方建议使用 synchronized,除非你有新的需求
    domty
    domty
    Sep 28, 2017
    8
    你试试写个测试不就知道了。
    如果你 test2()这个方法没有对 aLock 进行加解锁操作的话,不会阻塞。
    haozhang
    haozhang
    Sep 28, 2017 via iPhone
    9
    @puritania 最先拿到这个锁的人
    puritania
    puritania
    OP
    Sep 28, 2017
    10
    测试了 是不会阻塞的 看来想多了
    @domty
    misaka19000
    misaka19000
    Sep 28, 2017
    12
    反编译一下就知道是怎么回事了
    ihuotui
    ihuotui
    Sep 28, 2017 via iPhone
    13
    aqs 高级同步队列
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3057 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 04:41 · PVG 12:41 · LAX 20:41 · JFK 23:41
    ♥ Do have faith in what you're doing.