Java中的i++是原子操作吗?

简介: Java中的i++是原子操作吗?

我们都知道i++分为三步进行,分别是1:取到当前i的值,2:++,3:将最终结果赋值


因此我们可通过创建两个线程,对同一个变量count,一个线程对count进行递增操作,另一个线程对count进行递减操作。每个线程都执行100次操作。


如果count的操作是原子操作,那么最终的结果应该是0。但是如果count的操作不是原子操作,那么由于两个线程并发执行,可能会出现数据竞争,a线程在进行操作时,任何情况下都会被b线程打断,导致最终结果不是0。

代码实现如下所示:

package com.wjr.redis;
public class AtomicityTest {
    private static int count = 0;
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(new IncrementTask());
        Thread t2 = new Thread(new DecrementTask());
        t1.start();
        t2.start();
        /*调用join()方法会阻塞当前线程,主线程会等待t1和t2线程执行完成后再继续执行*/
        t1.join();
        t2.join();
        System.out.println("Final count value: " + count);
    }
    static class IncrementTask implements Runnable {
        @Override
        public void run() {
            for (int i = 0; i < 100; i++) {
                count++;
            }
        }
    }
    static class DecrementTask implements Runnable {
        @Override
        public void run() {
            for (int i = 0; i < 100; i++) {
                count--;
            }
        }
    }
}

我们多次运行会发现count不为0且有好几种不同的结果,因此Java中的i++并不是原子操作。

相关文章
|
6月前
|
安全 Java API
Java多线程编程:使用Atomic类实现原子操作
【4月更文挑战第6天】Java的`java.util.concurrent.atomic`包提供了一系列原子类,如`AtomicInteger`和`AtomicLong`,利用CPU原子指令保证无锁情况下变量更新的原子性,从而实现线程安全。这些类在高并发场景下能避免线程阻塞,提高性能。`AtomicInteger`和`AtomicLong`支持原子地增加、减少和设置值,而`AtomicReference`则适用于原子更新引用对象。尽管原子类具有非阻塞、线程安全和易用等优点,但它们仅保证单个变量的原子性,复杂操作可能仍需传统同步机制。了解其工作原理和局限性,有助于提升并发应用性能。
94 0
|
3月前
|
安全 Java API
Java多线程编程:使用Atomic类实现原子操作
在Java多线程环境中,共享资源的并发访问可能导致数据不一致。传统的同步机制如`synchronized`关键字或显式锁虽能保障数据一致性,但在高并发场景下可能导致线程阻塞和性能下降。为此,Java提供了`java.util.concurrent.atomic`包下的原子类,利用底层硬件的原子操作确保变量更新的原子性,实现无锁线程安全。
30 0
|
5月前
|
存储 Java 索引
Java中的13个原子操作类
Java中的13个原子操作类
55 0
|
5月前
|
安全 Java
并发编程-Java如何实现原子操作(CAS或锁)
并发编程-Java如何实现原子操作(CAS或锁)
34 0
|
6月前
|
存储 安全 Java
java多线程之原子操作类
java多线程之原子操作类
|
缓存 Java
【并发编程的艺术】JAVA 原子操作实现原理
本篇把原子操作单独拿出来详细阐述,结合前面两篇文章中的CPU多级缓存结构进行串联,加深理解。下一篇会全面研究Java的内存模型。
162 0
|
缓存 算法 安全
Java Review - 并发编程_原子操作类LongAdder & LongAccumulator剖析
Java Review - 并发编程_原子操作类LongAdder & LongAccumulator剖析
119 0
|
算法 Java
Java Review - 并发编程_原子操作类原理剖析
Java Review - 并发编程_原子操作类原理剖析
76 0
|
安全 Java
并发编程-Java如何实现原子操作(CAS或锁)
并发编程-Java如何实现原子操作(CAS或锁)
82 0
|
存储 Java 数据库连接