我正在阅读akka documentation,现在我在关于非阻止保证的部分。以下是为这些概念提供的定义:
如果确保evey呼叫在a中完成,则方法等待 有限步骤
锁定自由是一种比等待自由更弱的属性。在锁定的情况下 - 免费调用,无限经常某些方法在有限数量内完成 步骤。
阻碍自由是最弱的非阻塞保证[...]。方法是 如果有一个时间点,则称为无障碍物 隔离的ecxecutes
通常采用乐观并发控制(OOC)方法 梗阻免费。 OOC的方法是每个参与者都试图 在共享对象上执行其操作,但如果是参与者 检测来自其他人的情况,它会回滚修改,并且 根据一些时间表再次尝试。
因此,请考虑以下方法:
public class MyClass{
private final AtomicInteger ai = new AtomicInteger(0);
public void method(){
while(true){
int current = ai.get();
if(ai.compareAndSet(current, current + 1))
break;
}
}
}
我们可以把它放到哪个类别?我认为它的 OOC 方法(显然是通过定义)和 Obstruction-freedom 方法(显然是通过定义),但它不是锁定自由一个。
但是我对此并不十分肯定,锁定自由度的定义有点模糊,特别是 的一部分,无限经常某些方法在有限的步骤中完成 即可。它应该是什么意思?你不能给我一个等待和无锁方法的例子吗?
答案 0 :(得分:2)
<强>等待自由度强>
您的方法不能归入此类别。 这是因为当多个线程运行method()函数时,一个或多个线程可以使其他线程需要更多步骤。 问题是由于:
int current = ai.get();
// another thread can adjust the number between our statements!
if(ai.compareAndSet(current, current + 1)) // Returns true if the value of ai is still 'current'
break;
如果保证每个调用都以有限的步数完成,则方法是无等待的。
如果方法是无限制的,则步数具有有限的上限。
给定无限的线程,上限将变为无穷大。
<强>锁定自由强>
根据http://www.cs.swan.ac.uk/~csdavec/HPC/11LockFreedom.pdf
•至少有一个线程必须能够在任何线程上取得进展 给定时间
•最终,所有线程都必须取得进展
•给定无限时间,无限多线程将进展
所以你必须保证至少有一个线程取得进展。这是因为compareAndSet仅在值仍然相同时更新值。结合如果它没有改变,代码进展(中断)的事实。
因此,至少有一个线程可以保证取得进展。
<强>梗阻自由度强>
请参阅上一节中提到的链接。它声明:
暂停所有其他线程的单个线程可以完成它 工作
您的代码属于此类别,因为如果在这两个语句的持续时间内只有一个主题处于活动状态,那么它将保证结束。
乐观并发控制(OCC)
OCC似乎是一个特殊的无障碍子案例。它确实属于这个,因为如果compareAndSet检测到更改,它会取消更新数字。关于什么&#34;无限经常某些方法在有限数量的步骤中完成的问题。&#34;的意思是:
它实质上是指我在锁定自由部分中引用的部分,因为每次至少有一个进程运行代码时,一个进程必须取得进展。
这意味着给定足够的时间所有进程(如果进程数量无限,则无限!)将取得进展。
*结论*
没有等待免费分类。
它确实分为无锁,无障碍和OCC。