Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java原子整数和C#Interlocked.Increment方法之间的差异_C#_Java_Multithreading_Thread Safety - Fatal编程技术网

Java原子整数和C#Interlocked.Increment方法之间的差异

Java原子整数和C#Interlocked.Increment方法之间的差异,c#,java,multithreading,thread-safety,C#,Java,Multithreading,Thread Safety,我只是想知道,在Java中增加静态变量和在线程环境中增加C#之间有什么区别吗 在Java中使用原子int:s进行此操作,在C中使用Interlocked.Incement(参考yourVar) 我的意思不是你写的代码,而是它实际上是如何锁定内存和实际增量的。在Java的情况下,“如何工作”取决于执行平台的指令集。我读到(今天早些时候在等待无休止的操作系统升级完成时)x86 AtomicXxx类是使用比较和交换(CAS)指令实现的。联锁操作不会锁定内存,而是根据操作向指令发出锁定前缀。这会导致处理

我只是想知道,在Java中增加静态变量和在线程环境中增加C#之间有什么区别吗

在Java中使用原子int:s进行此操作,在C中使用Interlocked.Incement(参考yourVar)


我的意思不是你写的代码,而是它实际上是如何锁定内存和实际增量的。

在Java的情况下,“如何工作”取决于执行平台的指令集。我读到(今天早些时候在等待无休止的操作系统升级完成时)x86 AtomicXxx类是使用比较和交换(CAS)指令实现的。

联锁操作不会锁定内存,而是根据操作向指令发出锁定前缀。这会导致处理器断言总线锁,从而只执行一次指令。
您可以进一步查看

这不是一个语言问题。虚拟机的不同版本、不同实现或不同平台目标可能会影响这些功能的内部行为。实际上,java非常非常基于CAS(在其核心),并且它也提供类似CAS的原语。因此,无论是LL/CS还是自然CAS都不重要。C#使用WinAPI联锁函数来实现。如果内存运行良好,它就是add w/LOCK前缀。是的,java中的原子元素是循环(if(cas)break)。可通过加锁实现C#中的联锁。