了解饥饿自由和无等待方法

时间:2016-06-10 06:45:20

标签: java multithreading

我正在阅读akka documentation,现在我在关于非阻止保证的部分。这就是所说的(强调我的):

  

如果每个呼叫都保证在a中完成,则方法是等待的   有限的步骤。

     

[...]

     

因为每个参与者可以在有限数量的步骤之后进展(当时   电话结束), 等待免费方法没有饥饿

强调对我来说并不十分清楚。饥饿在文档的早期定义,因为参与者不可能取得进展(有些人是饥饿的)。

现在,如果多个线程调用相同的无等待方法,它们就不能被饿死。是否意味着即使该方法是阻塞且无等待,也不会发生stavation?关于无等待方法,我只是无法准确描述细节?

例如,如果方法调用 阻止I / O 方法,它是否等待?我说不,不是。但是这个怎么样:

public class MyClass{

    private static Object mutex = new Object();
    private int sharedInt = 0;

    public void isItWaitFree(){
        synchronized(mutext){
             ++sharedInt;
        }
    }

    //The rest
}

我说这取决于//The rest,因为这可能会无限期地涉及mutex次获取。

真正的无等待方法的例子是什么?

UPD:我认为wiat-freedom方法是使用非阻塞技术的方法,如AtomicXxx类,或者我们可以保证有限数量的mutex时间。

1 个答案:

答案 0 :(得分:2)

据我所知,wait-freedom不仅是函数/方法的属性,而且还是将要执行的环境。由于“不公平”调度算法可能导致饥饿,因此可以实现等待自由

  1. 仅适用于非阻塞方法
  2. 仅在调度方法的情况下,排队任务的有效优先级逐渐与其等待时间成比例地增加,直到他们到达队列的顶部并有机会完成他们的工作。
  3. <强>更新

    或者,方法的wait-freedom属性/特权可能以某种方式暴露给调度程序,因此它可以单独调度这些任务。