我有一个进程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锁,那
问题内容: 我想要一个布尔值来通知系统的某些部分特定服务已启动。 由于某些奇怪的原因,我得到了错误。 奇怪的是notifyAll()在一个同步块内,该块控制着我调用notifyAll()的对象。 我的课是这样开始的: 我正在开发一个android应用程序。我认为它不会影响任何事情,但是我会在注释中补充这个问题,以防影响Java的工作方式。 如果对象锁定在同步块中,为什么会出现异常? 问题答案: 线
问题内容: 如果我在同一个类中有2个同步方法,但是每个方法都访问不同的变量,那么2个线程可以同时访问这2个方法吗?锁是否发生在对象上,或者是否与同步方法中的变量一样具体? 例: 2个线程可以同时执行访问类X的相同实例吗? 问题答案: 如果将方法声明为已同步(就像你通过键入进行的操作一样),则会在整个对象上进行同步,因此,从同一对象访问不同变量的两个线程仍然会相互阻塞。 如果你一次只想同步一个变量,
问题内容: 我需要确定JavaScript中的数组中是否已存在对象。 例如(dummycode): 现在,“carBrands”数组包含所有实例。我现在正在寻找一种快速解决方案,以检查car1,car2,car3或car4的实例是否已经在carBrands数组中。 例如: car1和car4包含相同的数据,但是不同的实例,应测试它们是否相等。 我是否在创建时向对象添加了哈希值?还是有更快的方法来用