Java 它可以上锁吗?
我正在使用Java编写一个web服务。我还有一个资源,所以对这个资源的访问应该是同步的。我使用了两种不同的锁: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
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)
。“没事吧?”托尼:是的,他们没事。