Java 它可以上锁吗?

Java 它可以上锁吗?,java,multithreading,Java,Multithreading,我正在使用Java编写一个web服务。我还有一个资源,所以对这个资源的访问应该是同步的。我使用了两种不同的锁:saltLock和waitLock。这个代码似乎是死锁的吗 @WebMethod(operationName = "getSalt") public String getSalt() { synchronized(waitLock) { //wait until ip is already in use //could wait a

我正在使用Java编写一个web服务。我还有一个资源,所以对这个资源的访问应该是同步的。我使用了两种不同的锁:
saltLock
waitLock
。这个代码似乎是死锁的吗

    @WebMethod(operationName = "getSalt")
    public String getSalt() {
    synchronized(waitLock)
    {
      //wait until ip is already in use
      //could wait a lot
      synchronized(saltLock)
      {
         //modify resource
      }
    }
   } 

@WebMethod(operationName = "doSmt")
public String doSmt()
{
   //some code...
  synchronized(saltLock)
  {
     //modify resource
  } 
}
奖金问题:

1) 使用内部
同步
可以吗

2)
synchronized(waitLock)
是否阻止其内部
synchronized(saltLock)

  • 没有
  • 此代码正常,没有死锁问题

    此代码可能会死锁:

    @WebMethod(operationName = "getSalt")
    public String getSalt() {
    synchronized(waitLock)
    {
      //wait until ip is already in use
      //could wait a lot
      synchronized(saltLock)
      {
         //modify resource
      }
    }
    
    
    @WebMethod(operationName = "doSmt")
    public String doSmt()
    {
       //some code...
      synchronized(saltLock)
      {
         //modify resource
         synchronized(waitLock) {
          // some code
         }
      } 
    }
    
  • 没有
  • 此代码正常,没有死锁问题

    此代码可能会死锁:

    @WebMethod(operationName = "getSalt")
    public String getSalt() {
    synchronized(waitLock)
    {
      //wait until ip is already in use
      //could wait a lot
      synchronized(saltLock)
      {
         //modify resource
      }
    }
    
    
    @WebMethod(operationName = "doSmt")
    public String doSmt()
    {
       //some code...
      synchronized(saltLock)
      {
         //modify resource
         synchronized(waitLock) {
          // some code
         }
      } 
    }
    

    如果这是您对
    saltLock
    waitLock
    执行的唯一锁定,并且
    doSmt()
    无法调用
    getSalt()
    ,那么它是安全的


    当不同的线程试图以不同的顺序获取多个锁时,就会发生死锁。在这里,第二个线程只获取一个锁,因此它是线程安全的。

    如果这是您对
    saltLock
    waitLock
    执行的唯一锁定,并且
    doSmt()
    不能调用
    getSalt()
    ,那么它是安全的


    当不同的线程试图以不同的顺序获取多个锁时,就会发生死锁。在这里,第二个线程只获取一个锁,因此它是线程安全的。

    检查此链接[嵌套同步块][1][1]:检查此链接[嵌套同步块][1][1]:还有一些方法,如
    doSmth()
    。他们做同样的事情,只是有些代码不同。他们最后都有一个
    synchronized(saltLock)
    。还好吗?@Tony是的,他们还好。我还有一些方法,比如
    doSmth()
    。他们做同样的事情,只是有些代码不同。他们最后都有一个
    synchronized(saltLock)
    。“没事吧?”托尼:是的,他们没事。