什么是原子操作?

  • Post category:Java

什么是原子操作?

原子操作指的是在执行过程中不会被中断的一种操作方式,也就是说在多线程或者并发操作中,能够保证该操作完全执行或者完全不执行,不会出现执行过程被其他线程或进程中断的情况。原子操作通常是由硬件级别提供支持,代表了操作的不可分割性。

如何使用原子操作?

在编程语言中,原子操作通常是由特殊的指令或者API提供支持,具有以下特点:

  • 不会被中断或者阻塞;
  • 操作期间CPU不能参与其他操作;
  • 操作的结果对其他线程或者进程可见。

使用原子操作的目的通常是为了避免多线程或者并发操作引起的数据竞争问题,保证数据的正确性和一致性。

示例一:Java中的 AtomicInteger

在 Java 中,原子操作通常是由 java.util.concurrent.atomic 包提供支持,其中的 AtomicInteger 就是其中之一。该类提供了原子的增加和减少操作,用法如下:

import java.util.concurrent.atomic.AtomicInteger;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        AtomicInteger atomicInteger = new AtomicInteger(0);
        Thread thread1 = new Thread(() -> {
            int oldValue, newValue;
            do {
                oldValue = atomicInteger.get();
                newValue = oldValue + 1;
            } while (!atomicInteger.compareAndSet(oldValue, newValue));
        });

        Thread thread2 = new Thread(() -> {
            int oldValue, newValue;
            do {
                oldValue = atomicInteger.get();
                newValue = oldValue + 1;
            } while (!atomicInteger.compareAndSet(oldValue, newValue));
        });

        thread1.start();
        thread2.start();
        thread1.join();
        thread2.join();

        System.out.println("Result: " + atomicInteger.get());
    }
}

这段代码中,我们创建了两个线程来并发的增加一个 AtomicInteger 的值。在每个线程中,我们使用了 compareAndSet() 方法来实现对 AtomicInteger 的原子增加,该方法会在原始值等于指定的期望值时,对原始值进行更新,否则不做任何操作。

示例二:C++中的 atomic

在 C++ 中,原子操作通常是由 std::atomic 类提供支持,该类提供了原子的类型定义和相关操作。以下是一个示例:

#include <iostream>
#include <atomic>
#include <thread>

std::atomic<int> atomicInt(0);

void increaseInt(int loops) {
    for (int i = 0; i < loops; i++) {
        atomicInt++;
    }
}

int main(int argc, char** argv) {
    std::thread thread1(increaseInt, 100000);
    std::thread thread2(increaseInt, 100000);

    thread1.join();
    thread2.join();

    std::cout << "Result: " << atomicInt << std::endl;
    return 0;
}

在这个例子中,我们使用了 std::atomic 定义了一个原子的 int 类型。

在 increaseInt() 函数中,我们使用了 atomicInt++ 操作来增加 atomicInt 的值。这里 ++ 操作符是一个简写形式,使用了内置的操作符重载来实现对 atomicInt 的原子增加。

运行上述程序将得到 200000 的结果。

结语

原子操作是保证多线程操作正确性和一致性的重要手段,但是要注意它并不总是能完全解决多线程问题,需要根据具体情况来选择是否需要使用原子操作。