lock.wait(1)*是否保证竞争锁的线程会在这个时间内获取它



我有一个控制器线程,它在synchronized(lock)中永久地:它执行一个计算步骤,然后执行wait(1000),然后检查是否需要做更多的工作。如果是,则执行另一个步骤并等待(1000(。如果没有,它就直接等待(1000(。(请注意,我使用的是等待,而不是睡眠。(

有时,控制器调用的计算步骤会要求控制器连续多次调用它们——这是一种持续数秒的高性能模式。在此期间,没有其他线程(例如Swing(可以更改此控制器线程使用的数据。如果Swing尝试这样做,它现在会挂起来!

我想在高性能和良好的流动性之间保持平衡。

因此,我想在这个高性能模式循环中添加wait(1)

问题:如果我在计算循环中加入这些wait(1)调用,等待获取lock的线程会以绝对的确定性获得主导地位吗

问题:如果我在计算循环中加入这些wait(1(调用,等待获取锁的线程会以绝对的确定性获得优势吗?

简单的答案是,当lock.wait(1)返回时,您总是得到锁。然而,我认为您不了解如何使用锁定和通知来获得对共享资源的控制。要调用lock.wait(1),首先需要拥有锁。如果调用了lock.notify()notifyAll(),或者超时超过(注意(,则调用释放锁定并返回。这意味着,如果其他人拥有该锁很长一段时间,除非释放该锁,否则wait(...)方法不会返回——这可能会持续数毫秒。它旨在帮助线程之间进行协调。

如果问题是";在计算循环中调用CCD_ 11是否只给其他人锁定1ms;那么答案是否定的。

如果您有一个资源一次只能由一个线程使用,那么其他线程将需要等待,直到它可用。您希望每个线程都能在短时间内使用资源,这样等待的时间就很短。

您可以使用几种不同的机制来保护资源。最简单的方法是只放置一个synchronized块来使用它。这可以保护它不受竞争条件的影响,并确保对资源的任何更改都可以发布到所有线程的主存中。使用此机制不需要等待或通知调用。

另一种方法是使用lock.wait(...)lock.notify()。当(例如(线程从集合中消费并且需要等待添加实体时,需要使用此机制。在这种情况下,当线程向其调用lock.notify()的集合添加实体时,任何在lock.wait()中等待工作的线程都将被通知有工作要做,并将被唤醒。

lock.wait(...)超时参数的使用意味着线程可以等待一定的时间,等待资源可用后再放弃。在上面的队列处理示例中,线程可能需要每隔一秒左右检查应用程序是否正在关闭。因此,他们调用lock.wait(1000),测试是否设置了关闭标志,如果没有,他们可以检查要完成的工作,然后再次调用wait。仅仅因为您正在调用CCD_ 19并不能确保任何类型的锁定";支配地位";并不意味着该方法在1ms后返回。

如果要使用等待和通知信号,则需要一个辅助变量来检查资源是否正在使用。以下示例使用inUse布尔字段。

private final Object lock = new Object();
private boolean inUse = false;
...
synchronized (lock) {
while (inUse) {
lock.wait();
}
inUse = true;
}
// use the resource
...
synchronized (lock) {
inUse = false;
lock.notify();
}

请注意,该示例在while循环中测试inUse,而不仅仅是if。这是一个重要的模式,是必要的,因为您可能会收到通知,但在您等待时,另一个线程可能已经访问了资源。

最新更新