5

我是 .net 的新手,想知道 .net 是否具有 Java 等效的 AtomicInteger、ConcurrentLinkedQueue 等?

我做了一些搜索,但什么也想不出来。

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

4

5 回答 5

6

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

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

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

于 2008-11-29T09:05:05.290 回答
4

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

咆哮包

于 2008-11-29T09:22:16.847 回答
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

于 2008-11-29T09:18:54.077 回答
0

作为信息,.NET 4.0 很可能(此处)将从Parallel Extensions继承 CCR/TPL 。特别是 TPL 引入了一系列集合和其他为高级线程场景设计的结构(具有最少的锁等)。

目前,线程集合等的数量有限,加上通常的锁定原语 plusInterlocked等。

于 2008-11-29T09:57:50.427 回答
0

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

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

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

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

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

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

于 2008-11-29T10:12:26.230 回答