2014-05-22 111 views
0

我正在使用Java编写Web服务。另外我有一个资源,所以应该同步访问这个资源。我正在使用2个不同的锁:saltLockwaitLock。这段代码似乎是可以锁定的吗?它是否可以锁定?

@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)

+0

检查此链接[嵌套同步块] [1] [1]:http://stackoverflow.com/questions/10365132/java-nested-synchronization-blocks –

回答

3
  1. 没有

这段代码就可以了,没有死锁问题。

此代码可能死锁:

@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 
    } 
    } 
} 
1

如果这是唯一的锁定你做saltLockwaitLock,并doSmt()不能打电话getSalt(),它是安全的。

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

+0

而且我有几个像'doSmth()'这样的方法。他们做同样的事情,只有'//一些代码...'是不同的。他们最后都有一个“同步(saltLock)”。可以吗? – Tony

+0

@Tony是的,他们没事。 – erickson

相关问题