我有一个进程A,它在内存中包含一个带有一组记录(recordA,recordB等的表)的表。
现在,此过程可以启动许多影响记录的线程,有时我们可以有2个线程尝试访问同一记录- 必须拒绝这种情况。具体来说,如果一条记录被一个线程锁定,我希望另一个线程中止(我不想阻止或等待)。
目前,我正在执行以下操作:
synchronized(record) { performOperation(record); }
但这引起了我的问题…因为Process1在执行操作时,如果Process2进入其中,它将阻塞/等待同步语句,而Process1完成时,它将执行操作。相反,我想要这样的东西:
if (record is locked) return; synchronized(record) { performOperation(record); }
关于如何实现这一目标的任何线索?任何帮助将非常感激。谢谢,
有一点要注意的是, 即时 你收到这样的信息,它已经过期。换句话说,您可能被告知没有人拥有该锁,但是当您尝试获取它时,您将阻塞,因为另一个线程在支票和您尝试获取它之间取出了锁。
Brian是正确的选择Lock,但我认为您真正想要的是它的tryLock方法:
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中的类相同的“内置”锁定功能。然后,同样,还有很多在线程化方面,我在这两个平台上都不喜欢其他事情- 例如,每个对象都可能有一个监视器!)
Monitor