我是.net的新手,想知道.net是否具有AtomicInteger,ConcurrentLinkedQueue等的java等价物?
我做了一些搜索,无法想出任何东西。
无锁算法需要某种CAS指令,它是通过Java中未记录的Unsafe类提供的,.net有什么等价的吗?
答案 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中编写了大量无锁不可变的集合结构。这包括二叉树,地图,数组,链表等......源代码和二进制文件可在代码库中找到
答案 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永远不会发生的情况,每个线程总是会得到不同的值。