如何确定一个对象是否被锁定(同步),而不是在Java中阻塞?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (18)

我有一个进程A,包含一组记录(记录A,记录B等等)

现在,这个过程可以启动影响记录的许多线程,有时我们可以有2个线程试图访问相同的记录 - 这种情况必须被拒绝。特别是如果一条记录被一个线程锁定,我希望另一个线程中止(我不想阻塞或等待)。

目前我做这样的事情:

synchronized(record)
{
performOperation(record);
}

但是这导致了我的问题...因为当Process1执行操作时,如果Process2进入,它将阻止/等待同步语句,并且当Process1完成时它将执行操作。相反,我想要这样的东西:

if (record is locked)
   return;

synchronized(record)
{
performOperation(record);
}

如何实现我想做到的?

提问于
用户回答回答于

你可以被告知没有人有锁,但是当你试图获得它时,你会阻止,因为另一个线程取出了支票和你试图获得它之间的锁。

我认为你真正想要的是它的tryLock方法:

Lock lock = new ReentrantLock();
......
if (lock.tryLock())
{
    // Got the lock
    try
    {
        // Process record
    }
    finally
    {
        // Make sure to unlock so that we don't cause a deadlock
        lock.unlock();
    }
}
else
{
    // Someone else had the lock, abort
}

用户回答回答于

查看Java 5并发包中引入的Lock对象。

Lock lock = new ReentrantLock()
if (lock.tryLock()) {
   try {
      // do stuff using the lock...
   }
   finally {
      lock.unlock();
   }
}
   ...

扫码关注云+社区