【问题标题】:Is lock released when non synchronised method is called调用非同步方法时是否释放锁
【发布时间】:2013-12-27 13:51:29
【问题描述】:

如果我有一个同步的方法A

public synchronized void methodA() {
    // ... Some code
    methodB();
    // ... Some more code
}

我有一个不同步的methodB,它是从methodA调用的

private void methodB() {
    // ...
}

线程将获取锁并进入methodA。我的疑问是当从methodA调用methodB时,当controll回到methodA时,锁会被释放并再次获取。

【问题讨论】:

  • 不,不是,methodA只要没有完成就会持有锁。

标签: java multithreading


【解决方案1】:

没有。这样做的唯一方法是 Object.wait();

例如

public synchronized void methodA() {
    // ... Some code
    // releases the lock, waits 1000 ms or until notify()ed, & regains the lock.
    wait(1000); 
    // .. some code.
    methodB(); // doesn't do anything to the lock
    // ... Some more code
}

注意:由于它不会释放锁,因此您可能会出现多锁死锁。

class MyClass {
    public synchronized void methodA(MyClass mc) {
         mc.methodB();
    }

    public synchronized void methodB() {
         // something
    }
}

static MyClass MC1 = new MyClass(), MC2 = new MyClass();

如果你有一个线程调用

MC1.methodA(MC2);

和另一个调用

MC2.methodA(MC1);

你可能会陷入僵局。这是因为第一个方法锁定了一个对象,而第二个调用锁定了另一个。由于线程以不同的顺序执行此操作,因此每个线程都有可能持有另一个需要的锁。

【讨论】:

  • Object.wait() 在 wait(1000) 期间释放锁。它是否再次获得锁?
  • @Octopus 我已经更新了答案。即使被中断,它也会重新获取锁(或等待直到可以)。
  • 感谢您的快速回复。如果在我的代码中 methodB 是公共的还是私有的,这会有所不同吗?
  • @nascent none,只有static 对锁定有影响。
猜你喜欢
  • 2014-06-07
  • 2021-02-22
  • 2012-03-20
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
相关资源
最近更新 更多