V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
puritania
V2EX  ›  Java

请教一个多线程锁的问题

  •  
  •   puritania · 2017-09-28 17:52:30 +08:00 · 2836 次点击
    这是一个创建于 2647 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 条回复    2017-09-28 20:40:06 +08:00
    owenliang
        1
    owenliang  
       2017-09-28 18:19:07 +08:00   ❤️ 2
    你应该读读书。
    alqaz
        3
    alqaz  
       2017-09-28 18:33:12 +08:00 via Android
    锁在 lock 和 unlock 之间。如果 test2 调用了 lock 那么就会,否则,不会
    haozhang
        4
    haozhang  
       2017-09-28 18:33:24 +08:00 via iPhone   ❤️ 1
    不是调用 test 会锁,进入了临界区域就会锁,从 lock 开始到 unlock 结束,这片区域就是临界区域。
    puritania
        5
    puritania  
    OP
       2017-09-28 18:38:25 +08:00
    @haozhang 那此时锁的持有者算是谁呢?
    misaka19000
        6
    misaka19000  
       2017-09-28 18:51:39 +08:00 via Android
    Java 好像用的是 monitor 指令吧,一类是加在对象上,另一类好像是不需要加在对象上面的
    sunqb
        7
    sunqb  
       2017-09-28 19:00:37 +08:00 via Android
    官方建议使用 synchronized,除非你有新的需求
    domty
        8
    domty  
       2017-09-28 19:18:31 +08:00
    你试试写个测试不就知道了。
    如果你 test2()这个方法没有对 aLock 进行加解锁操作的话,不会阻塞。
    haozhang
        9
    haozhang  
       2017-09-28 19:39:59 +08:00 via iPhone
    @puritania 最先拿到这个锁的人
    puritania
        10
    puritania  
    OP
       2017-09-28 19:46:24 +08:00
    测试了 是不会阻塞的 看来想多了
    @domty
    misaka19000
        12
    misaka19000  
       2017-09-28 20:35:54 +08:00
    反编译一下就知道是怎么回事了
    ihuotui
        13
    ihuotui  
       2017-09-28 20:40:06 +08:00 via iPhone
    aqs 高级同步队列
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1110 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 76ms · UTC 18:49 · PVG 02:49 · LAX 10:49 · JFK 13:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.