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

标签 java synchronization

我有一个进程 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/

相关文章:

sql-server - 使用 Microsoft 同步框架 2.1 更新架构更改

java - 如何使在 Java 中阻塞的函数超时?

java - Neo4j 在切换版本时显示错误

java - 在 Logback 中对 Appender 进行分组?

java - 退出Java前如何保存

JavaScript 事件同步

java - 为什么 SparseIntArray 不实现 Map<Integer, Integer>?

java - 为自定义语法创建自定义代码分析规则,并进行测试: howto?

database - Talend Open Studio For MDM + Postgresql + 同步两个数据库

java - java中的synchronized "deep"是同步的吗?