2016-06-10 84 views
2

我在阅读akka documentation,现在我在关于非阻塞保证的部分。以下是我所说的(强调我的):了解饥饿自由和无等待方法

如果每个呼叫都保证以有限数量的步骤完成,那么方法是等待免费的。

[...]

为每个参与者可以在有限数量的步骤(当 呼叫结束)后进步,无等待方法不含饥饿的。

我强调的不是很清楚。在文档中早些时候定义了饥饿,因为参与者不可能取得进展(有些饥饿)。

现在,如果多个线程调用相同的无等待方法,它们不能被饿死。这是否意味着即使方法阻塞并等待免费,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自由度方法是那些使用不进行阻断技术,如AtomicXxx类或如果我们可以保证持有有限量的时间mutex

+0

“该方法是阻塞和等待免费”一个方法如何既是? – Raedwald

+0

有没有这样的事情等待_method_。等待自由是_algorithm_的一个属性。整个算法通常包含在单一方法中,但并非总是如此。如果'isItWaitFree()'的“等待自由”取决于'//其余',那么这可能意味着''剩下的''是同一个算法的一部分。 –

回答

2

为了我的理解,等待自由不仅是函数/方法的属性,也是它将要执行的环境的属性。由于饥饿可能发生由于“不公平的”调度算法,等待自由度,可以实现

  1. 只为非阻塞方法
  2. 仅在调度方法的情况下的排队任务的有效优先级是逐渐与他们的等待时间成比例地增加,直到他们到达队列顶端并且有机会完成他们的工作。

UPDATE:

可替代地,该方法的等待自由属性/特权可以某种方式暴露给调度,以便它可以单独地安排这样的任务。