在.net中锁定免费构造

时间:2008-11-29 08:46:53

标签: .net concurrency lock-free task-parallel-library

我是.net的新手,想知道.net是否具有AtomicInteger,ConcurrentLinkedQueue等的java等价物?

我做了一些搜索,无法想出任何东西。

无锁算法需要某种CAS指令,它是通过Java中未记录的Unsafe类提供的,.net有什么等价的吗?

5 个答案:

答案 0 :(得分:6)

在.NET中有Interlocked类,使用静态方法Interlocked.Increment()和Interlocked.Decrement()。

请参阅http://msdn.microsoft.com/en-us/library/system.threading.interlocked.aspx

您还可以在System.Threading命名空间中找到其他原子och同步结构。

答案 1 :(得分:4)

我在.Net中编写了大量无锁不可变的集合结构。这包括二叉树,地图,数组,链表等......源代码和二进制文件可在代码库中找到

RantPack

答案 2 :(得分:2)

Interlocked类具有执行简单原子操作(如递增,递减,比较,交换等)所需的所有静态方法。请查看http://msdn.microsoft.com/en-us/library/system.threading.interlocked_members.aspx

对于大多数集合,您可以通过名为“Synchronized”的静态成员获取同步集合。但请注意,这些不是无锁构造,它们只是隐藏了使用锁/信号量的混乱。检查队列集合的同步方法http://msdn.microsoft.com/en-us/library/system.collections.queue.synchronized.aspx

答案 3 :(得分:0)

有关信息,很可能(here).NET 4.0将从Parallel Extensions继承CCR / TPL。特别是,TPL引入了范围集合和其他为高级线程场景设计的构造(具有最小的锁等)。

目前,有一些数量有限的线程集合,加上通常的锁定灵长类动物,加上Interlocked等等。

答案 4 :(得分:0)

这是我在.net的Interlocked类中看到的问题。

我有多个线程更新计数器。 每个线程必须获得计数器的唯一值,因此没有线程必须获得相同的值。

.net中互锁类的工作方式,我有 -

int counter;
void code(){
    myThreadVal = Interlocked.increment(counter);
}

现在因为两个线程都可以看到计数器的相同值,所以它们都可以获得相同的myThreadVal值。

但是,对于java的AtomicInteger永远不会发生的情况,每个线程总是会得到不同的值。