我有一个进程 A,它在内存中包含一个表,其中包含一组记录(recordA、recordB 等...)
现在,这个进程可以启动许多影响记录的线程,有时我们可以有 2 个线程尝试访问同一条记录 - 这种情况必须被拒绝。具体来说,如果一条记录被一个线程锁定,我希望另一个线程中止(我不想阻塞或等待)。
目前我做这样的事情:
synchronized(record)
{
performOperation(record);
}
但这给我带来了问题......因为当 Process1 正在执行操作时,如果 Process2 进入,它会阻塞/等待同步语句,当 Process1 完成时,它会执行该操作。相反,我想要这样的东西:
if (record is locked)
return;
synchronized(record)
{
performOperation(record);
}
关于如何实现这一点有任何线索吗? 任何帮助将非常感激。 谢谢,
最佳答案
需要注意的一点是,一旦您收到此类信息,它就已经过时了。换句话说,您可能会被告知没有人拥有锁,但是当您尝试获取它时,您会阻塞,因为另一个线程在检查和您尝试获取它之间取出了锁。
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 中。话又说回来,当涉及到线程时,这两个平台上还有很多我不喜欢的东西 - 例如,每个对象都可能有一个监视器!)
关于java - 在Java中如何确定一个对象是否被锁定(同步)以免阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57331551/