欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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语言的指令)

  1. AutomicInteger类 ----->incrementandget;
    AtomicInteger调用过程以及保持原子性的原因
  2. final class Unsafe类----->getAndAddInt
    图片:AtomicInteger调用过程以及保持原子性的原因
  3. final class Unsafe类----->compareAndSwapInt
    这个方法是c语言的
    AtomicInteger调用过程以及保持原子性的原因
  4. c语言代码
    AtomicInteger调用过程以及保持原子性的原因AtomicInteger调用过程以及保持原子性的原因
  5. 代码看不懂,但是最终可以得出一个结论;
    最终实现:
    cmpxchg = cas修改变量值
    lock cmpxchg 指令
    硬件:
    lock指令在执行后面指令的时候锁定一个北桥信号
    (不采用锁总线的方式)