我是 .net 的新手,想知道 .net 是否具有 Java 等效的 AtomicInteger、ConcurrentLinkedQueue 等?
我做了一些搜索,但什么也想不出来。
无锁算法需要某种 CAS 指令,它是通过 Java 中未记录的 Unsafe 类提供的,.net 有什么等价的吗?
我是 .net 的新手,想知道 .net 是否具有 Java 等效的 AtomicInteger、ConcurrentLinkedQueue 等?
我做了一些搜索,但什么也想不出来。
无锁算法需要某种 CAS 指令,它是通过 Java 中未记录的 Unsafe 类提供的,.net 有什么等价的吗?
在 .NET 中有 Interlocked 类,具有静态方法 Interlocked.Increment() 和 Interlocked.Decrement()。
请参阅http://msdn.microsoft.com/en-us/library/system.threading.interlocked.aspx。
您还将在 System.Threading 命名空间中找到其他原子 och 同步结构。
我在 .Net 中编写了大量无锁不可变集合结构。这包括二叉树、地图、数组、链表等......源代码和二进制文件可在代码库中找到
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
作为信息,.NET 4.0 很可能(此处)将从Parallel Extensions继承 CCR/TPL 。特别是 TPL 引入了一系列集合和其他为高级线程场景设计的结构(具有最少的锁等)。
目前,线程集合等的数量有限,加上通常的锁定原语 plusInterlocked
等。
这是我在.net 的 Interlocked 类中看到的问题。
我有多个线程更新一个计数器。每个线程必须获得唯一的计数器值,因此没有线程必须获得相同的值。
.net 中的联锁类的工作方式,我有 -
int counter;
void code(){
myThreadVal = Interlocked.increment(counter);
}
现在,由于两个线程都可以看到相同的计数器值,因此它们都可以获得相同的 myThreadVal 值。
但是,在 java 的 AtomicInteger 永远不会发生的情况下,每个线程总是会得到不同的值。