ziy*_*uxe 2 java concurrency thread-safety
我的问题:
假设我有A一些变量的类a
和B带有变量的类prev和next
在课堂上,A我想制作changeIfEqual(B myB)检查是否的方法,如果是A.a == my_B.prev,我将更A.a改为my_B.next. 但是,如果A.a != my_B.prev我希望线程wait()直到 continion 为真,然后执行等待时间最长的线程。
所以我想A.changeIfEqual(B myB)应该是这样的:
public synchronized void changeIfEqual(B myB){
while(this.a != myB.b_prev){
wait();
}
notifyAll();
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,问题是如何确保恢复最旧的线程?(wait()并且notifyAll()不提供)
你没有。哪个线程得到通知取决于调度程序。如果将隐式锁定(使用同步)替换为 ReentrantLock,则可以指定锁定是公平的。但这不是一个完美的解决方案,请参阅API 文档:
此类的构造函数接受一个可选的公平参数。当设置为 true 时,在争用情况下,锁倾向于授予对等待时间最长的线程的访问权限。否则这个锁不能保证任何特定的访问顺序。与使用默认设置的程序相比,使用由多个线程访问的公平锁的程序可能会显示出较低的总体吞吐量(即更慢;通常慢得多),但在获取锁和保证不出现饥饿的时间上有较小的差异。但是请注意,锁的公平性并不能保证线程调度的公平性。因此,使用公平锁的许多线程之一可能会连续多次获得它,而其他活动线程没有进行并且当前没有持有该锁。另请注意,未计时的 tryLock 方法不遵守公平设置。