一尘不染

如何确定对象是否被锁定(同步),以免在Java中阻塞?

java

我有一个进程A,它在内存中包含一个带有一组记录(recordA,recordB等的表)的表。

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

目前,我正在执行以下操作:

synchronized(record)
{
performOperation(record);
}

但这引起了我的问题…因为Process1在执行操作时,如果Process2进入其中,它将阻塞/等待同步语句,而Process1完成时,它将执行操作。相反,我想要这样的东西:

if (record is locked)
   return;

synchronized(record)
{
performOperation(record);
}

关于如何实现这一目标的任何线索?任何帮助将非常感激。谢谢,


阅读 345

收藏
2020-09-08

共1个答案

一尘不染

有一点要注意的是, 即时
你收到这样的信息,它已经过期。换句话说,您可能被告知没有人拥有该锁,但是当您尝试获取它时,您将阻塞,因为另一个线程在支票和您尝试获取它之间取出了锁。

Brian是正确的选择Lock,但我认为您真正想要的是它的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
}

您还可以花tryLock一些时间等待呼叫-因此,您可以尝试在十分之一秒的时间内获取它,然后在无法获取时放弃(例如)。

(我感到遗憾的是,就我所知,Java
API没有提供与Monitor.NET中的类相同的“内置”锁定功能。然后,同样,还有很多在线程化方面,我在这两个平台上都不喜欢其他事情-
例如,每个对象都可能有一个监视器!)

2020-09-08