等待/锁定/阻碍自由和OOC方法的示例

时间:2016-06-10 07:25:26

标签: java multithreading

我正在阅读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 方法(显然是通过定义),但它不是锁定自由一个。

但是我对此并不十分肯定,锁定自由度的定义有点模糊,特别是 的一部分,无限经常某些方法在有限的步骤中完成 即可。它应该是什么意思?你不能给我一个等待无锁方法的例子吗?

1 个答案:

答案 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。