【问题标题】:Examples of wait/lock/obstruction-freedom and OOC methods等待/锁定/无阻塞和OOC方法的示例
【发布时间】:2016-10-11 01:42:48
【问题描述】:

我正在阅读akka documentation,现在我在关于非阻塞保证的部分。以下是为这些概念提供的定义:

如果每个调用都保证在一个 步数有限

Lock-freedom 是一个比wait-freedom 更弱的属性。在锁定的情况下- 免费调用,无限地经常某些方法以有限的数量结束 步骤。

无阻塞是最弱的非阻塞保证 [...]。一种方法是 如果有一个时间点之后它被称为无障碍物 单独执行

乐观并发控制 (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 方法(显然是根据定义),但它不是 Lock-freedom em> 一。

但我不太确定,lock-freedomness 的定义有点模糊,尤其是 infinitely 通常某些方法在有限数量的步骤中完成的部分。它应该是什么意思?你能不能给我一个 wait-freelock-free 方法的例子?

【问题讨论】:

标签: java multithreading


【解决方案1】:

无需等待

您的方法不能归入此类别。 这是因为当多个线程运行 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 仅在值仍然相同时才更新值。结合事实,如果它没有改变,代码会继续(中断)。

因此,至少有一个线程可以保证取得进展。

无障碍

请参阅上一节中提到的链接。它指出:

一个线程,所有其他线程都暂停,可以完成它的 工作。

您的代码属于这一类,因为如果在这 2 个语句的持续时间内只有一个线程处于活动状态,那么它肯定会结束。

乐观并发控制 (OCC)

OCC 似乎是一种特殊的无阻塞子情况。它确实属于此范围,因为如果 compareAndSet 检测到更改,它会取消数字的更新。

您的问题是“某些方法通常在有限的步骤中完成”。意思是:

它本质上是指我在无锁部分中引用的部分,因为每次至少有 1 个进程在运行代码时,必须有一个进程取得进展。

这意味着,如果有足够的时间,所有进程(如果进程数无限,则无限!)将取得进展。

* 结论 *

不属于免等待分类。

它确实分为无锁、无障碍和 OCC。

【讨论】:

  • method() 不能永远运行,始终保证 1 个线程成功,因为 if 只有在一个线程成功时才会失败(我认为外部来源不会改变值计数,并且即使他们无法足够可靠地更改值)
  • 对,对不起。让我重新表述一下答案。
猜你喜欢
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 2023-03-22
  • 2016-03-13
相关资源
最近更新 更多