当前位置: 首页 > 面试题库 >

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

舒俊雄
2023-03-14
问题内容

我有一个进程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中的类相同的“内置”锁定功能。然后,同样,还有很多在线程化方面,我在这两个平台上都不喜欢其他事情-
例如,每个对象都可能有一个监视器!)



 类似资料:
  • 在示例代码中 在这个页面上, lock1和lock2分别控制c1和c2上的更新。 然而, 正在获取对象lock1的锁并在同步块时释放它 被执行。 当这个代码块被执行时,这个对象的成员c1上可能还有一个更新——我看不出这个更新是如何被代码中的lock1上的同步所阻止的。 只有对象lock1可以独占访问——除此之外别无它物(?) 那么,实施情况如何 在上面的代码中不同于 甚至 当c1是一个对象而不是一

  • 假设我有两条线。Thread1正在访问一个同步方法,同时,Thread2正在访问同一对象的另一个同步方法。据我所知,Thread2应该等到Thread1完成它的任务。我的问题是,Thread2是否在对象的等待线程列表中?对我来说似乎是这样,但Thread2不调用wait()方法,那么作为逻辑结果,它不应该在对象的等待线程列表中。如果它不在对象的等待线程列表中,那么Thread2的状态是什么?

  • 我在学习K K 当一个方法从同步块中执行代码时,代码被称为在同步上下文中执行。当您同步一个方法时,用于调用该方法的对象是必须获取其锁的对象。但是当我们同步代码块时,您必须指定要使用哪个对象的锁作为锁。 在本例中,会在AccountDanger实例或Account对象上获取锁吗?我想应该是这样的。我感觉正确吗?如果它是AccountDanger对象,并且一个线程已获得AccountDanger锁,那

  • 问题内容: 我需要确定JavaScript中的数组中是否已存在对象。 例如(dummycode): 现在,“carBrands”数组包含所有实例。我现在正在寻找一种快速解决方案,以检查car1,car2,car3或car4的实例是否已经在carBrands数组中。 例如: car1和car4包含相同的数据,但是不同的实例,应测试它们是否相等。 我是否在创建时向对象添加了哈希值?还是有更快的方法来用

  • 问题内容: 如果我在同一个类中有2个同步方法,但是每个方法都访问不同的变量,那么2个线程可以同时访问这2个方法吗?锁是否发生在对象上,或者是否与同步方法中的变量一样具体? 例: 2个线程可以同时执行访问类X的相同实例吗? 问题答案: 如果将方法声明为已同步(就像你通过键入进行的操作一样),则会在整个对象上进行同步,因此,从同一对象访问不同变量的两个线程仍然会相互阻塞。 如果你一次只想同步一个变量,

  • 问题内容: 我想要一个布尔值来通知系统的某些部分特定服务已启动。 由于某些奇怪的原因,我得到了错误。 奇怪的是notifyAll()在一个同步块内,该块控制着我调用notifyAll()的对象。 我的课是这样开始的: 我正在开发一个android应用程序。我认为它不会影响任何事情,但是我会在注释中补充这个问题,以防影响Java的工作方式。 如果对象锁定在同步块中,为什么会出现异常? 问题答案: 线