Java原子整数和C#Interlocked.Increment方法之间的差异
我只是想知道,在Java中增加静态变量和在线程环境中增加C#之间有什么区别吗 在Java中使用原子int:s进行此操作,在C中使用Interlocked.Incement(参考yourVar)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的情况下,“如何工作”取决于执行平台的指令集。我读到(今天早些时候在等待无休止的操作系统升级完成时)x86 AtomicXxx类是使用比较和交换(CAS)指令实现的。联锁操作不会锁定内存,而是根据操作向指令发出锁定前缀。这会导致处理器断言总线锁,从而只执行一次指令。
您可以进一步查看这不是一个语言问题。虚拟机的不同版本、不同实现或不同平台目标可能会影响这些功能的内部行为。实际上,java非常非常基于CAS(在其核心),并且它也提供类似CAS的原语。因此,无论是LL/CS还是自然CAS都不重要。C#使用WinAPI联锁函数来实现。如果内存运行良好,它就是add w/LOCK前缀。是的,java中的原子元素是循环(if(cas)break)。可通过加锁实现C#中的联锁。