首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用同步语句的可重入同步行为

使用同步语句的可重入同步行为
EN

Stack Overflow用户
提问于 2011-04-26 16:44:57
回答 4查看 10.3K关注 0票数 6

我在一个java类中有两个方法,这两个方法都有一个使用相同对象进行同步的代码块。我知道在JAVA同步方案中,线程获取的锁是可重入的。有了这些,我可以放心地说,下面这段代码在所有情况下都不会导致任何问题?

代码语言:javascript
复制
public class Someclass  
{  
  private static final Object LCK_OBJ = new Object();  
  //.....

  publc void method1()  
  {  
    //some code....  
    synchronized(LCK_OBJ)  
    {  
        //some sychronized code.  
        method2(..);  
    }  
    //some more code....  
  }  

  protected static final void method2(..)  
  {  
      Someclass ref = null;  
      //some code which gets different other references of SomeClass in a loop....  
      ref.method3(..);  
  }  

  publc void method3()  
  {  
    //some code....  
    synchronized(LCK_OBJ)  
    {  
      //some sychronized code.  
    }  
    //some more code....  
  }  

}//end of class    
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-04-26 16:50:24

是的,你可以,但是这段代码不会编译:你从一个静态方法"method2“调用一个实例方法"method3”。除此之外:如果线程已经设法获得了"method1“中的锁,那么它仍然会拥有"method3”中的锁。

票数 5
EN

Stack Overflow用户

发布于 2011-04-26 16:48:35

是的,同步的块是可重入的。ReentrantLock也是可重入的,如果你想自己编写代码块,你可能会想要使用它,因为它有更多的灵活性/功能。

我会确保任何锁都是final的。如果一个锁对象不是最终的,那么它几乎肯定是一个bug (或者是混淆的根源)。

为了便于比较,并非Java中的所有锁都是可重入的。FileLock并非如此,因为它将请求直接传递给操作系统。

票数 8
EN

Stack Overflow用户

发布于 2011-04-26 16:47:56

是的,同一个线程可以多次进入同一个锁上的synchronized块。注意不要以不同的顺序获取其他锁,否则可能会导致死锁。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5787957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档