嵌套同步关键字
我在Java中有这样的代码:
public void doSomeThing() { synchronized (this) { doSomeThingElse(); } } public void doSomeThingElse() { synchronized (this) { // do something else } }
这个代码可以阻止吗? 我的意思是,这个代码可以永远等待吗?
正如Java文档描述的Reentrantlocking :
一个线程可以获得它已经拥有的锁
第二个同步块使用相同的锁,因此将始终可用,因为锁已经在外部方法中获得了。
不,不会有僵局。
如果一个线程拥有这个锁,它会进入其他synchronized
方法/块像黄油热刀。
在同步块中,您可以重新获得您已经拥有的锁。 locking提供程序(this)将被第一个线程获取以进入doSomething()。 然后在doSomethingElse()方法中它将重新获得它。
这样做的原因是什么? 那么没有什么可以说没有别的线程从其他地方进入doSomethingElse。 这将阻止任何代码执行doSomething()中的块,直到doSomethingElse()中的线程释放“this”。
编辑顺便说一句,它当然可以阻止…它会阻止任何不拥有同步对象的线程执行。 但它不会(像张贴)僵局。
锁已经被执行doSomething方法的线程占用,因此这个线程可以执行doSomethingElse方法。
你需要两个锁对象来创build死锁情况。 在你的情况下,只有一个,所以不可能造成死锁。
在这两种情况下同步使用,所以如果doSomeThing中的同步块运行,你已经有了锁,所以你可以执行doSomeThingElse方法。
如果你的代码如此简单,那就相当于:
public synchronized void doSomeThing() { doSomeThingElse(); } public synchronized void doSomeThingElse() { // do something else }
您已经在第一个同步监视器锁。 您应该始终确保并发devise不会对性能造成巨大影响。
确保这一点的一种方法是只同步所需的语句/代码。
现在让我们说你的代码看起来像这样。
public void doSomeThing() { synchronized (this) { synchronized (this) { // do something else } } }
而这是需要的
public void doSomeThing() { doSomeThingElse(); } public void doSomeThingElse() { synchronized (this) { // do something else } }