这段代码会不会导致死锁? Java线程锁定

时间:2010-10-29 13:10:08

标签: java multithreading locking

所以问题是,我希望能够和我的班级一起做这件事。

object.lockAccess(); object.doSomething(); object.doAnotherThing(); object.doAnotherThingYet(); object.unlockAccess();

因此其他线程在锁定时将无法访问我的类方法。 这是我做的实现,我想知道是否有人有更好的想法,或者它是否可能失败。

private boolean locked = false;

public void lockAccess() throws Exception
{
    while(!tryToLock())
    {
        Thread.sleep(1000);
    }
}

public void unlockAccess() throws Exception
{
    while(!tryToUnlock())
    {
        Thread.sleep(1000);
    }
}

private synchronized boolean tryToLock()
{
    if(locked)
        return false;
    else
    {
        locked = true;
        return true;
    }
}

private synchronized boolean tryToUnlock()
{
    if(locked)
        return false;
    else
    {
        locked = false;
        return true;
    }
}

3 个答案:

答案 0 :(得分:4)

while(!tryToLock())
    {
        Thread.sleep(1000);
    }

糟糕的主意。

使用java.util.concurrent中的Lock implementation

或只是synchronized阻止。

答案 1 :(得分:3)

根据你的意图,这样做会容易得多(因为你可以在Java中使用任何对象作为互斥体):

synchronized( object ) {
  object.doSomething(); 
  object.doAnotherThing(); 
  object.doAnotherThingYet();  
}

如果您需要更精细的控制,特别是tryLock,那么请查看“Lock”界面以及实现它的类。

答案 2 :(得分:3)

您的tryToUnlock()方法不正确,但在技术上可行。

大多数Java程序员会做更多这样的事情,但是:

synchronized (object) {
    object.doSomething();
    object.doSomethingElse();
    ...
}