AtomicInteger调用过程以及保持原子性的原因
程序员文章站
2024-03-25 21:27:58
...
AtomicInteger调用过程以及保持原子性的原因
代码示例
private static AtomicInteger m = new AtomicInteger(0);
public static void main(String[] arg) throws InterruptedException {
Thread[] threads = new Thread[100];
CountDownLatch latch = new CountDownLatch(threads.length);
long start = System.currentTimeMillis();
for (int i = 0;i < threads.length;i ++){
threads[i] = new Thread(() -> {
for (int j = 0;j < 10000; j ++){
m.incrementAndGet();
}
latch.countDown();
});
}
Arrays.stream(threads).forEach(x -> x.start());
latch.await();
long end = System.currentTimeMillis();
System.out.println(end - start);
System.out.println(m);
}
m.incrementAndGet()调用过程
atomicinteger—>incrementandget---->getandaddint---->compareandswapint(c语言的指令)
-
AutomicInteger类 ----->incrementandget;
- final class Unsafe类----->getAndAddInt
图片: - final class Unsafe类----->compareAndSwapInt
这个方法是c语言的
- c语言代码
- 代码看不懂,但是最终可以得出一个结论;
最终实现:
cmpxchg = cas修改变量值
lock cmpxchg 指令
硬件:
lock指令在执行后面指令的时候锁定一个北桥信号
(不采用锁总线的方式)