Java中的原子操作

举报
林欣 发表于 2024/06/23 22:37:56 2024/06/23
【摘要】 一、什么是原子操作原子操作是指在一个操作序列中,要么全部执行,要么全部不执行,不会被其他线程中断的操作。在Java中,原子操作主要通过java.util.concurrent.atomic包下的类来提供,这些类中的方法都是线程安全的,可以在多线程环境中安全地进行数据更新操作。 二、基本类型的原子操作Java的java.util.concurrent.atomic包提供了一系列原子操作类,用...

一、什么是原子操作

原子操作是指在一个操作序列中,要么全部执行,要么全部不执行,不会被其他线程中断的操作。在Java中,原子操作主要通过java.util.concurrent.atomic包下的类来提供,这些类中的方法都是线程安全的,可以在多线程环境中安全地进行数据更新操作。

二、基本类型的原子操作

Java的java.util.concurrent.atomic包提供了一系列原子操作类,用于对基本数据类型进行原子操作。这些类包括AtomicIntegerAtomicLongAtomicBoolean等,它们分别提供了对intlongboolean等基本数据类型的原子操作。

三、AtomicInteger

AtomicInteger类提供了对int类型的原子操作。它提供了诸如增加、减少、设置、获取并设置等操作,这些操作都是线程安全的。

3.1 使用案例

import java.util.concurrent.atomic.AtomicInteger;

public class AtomicIntegerExample {
    private AtomicInteger count = new AtomicInteger(0);

    public void increment() {
        count.incrementAndGet(); // 原子性地增加并返回新的值
    }

    public int getCount() {
        return count.get(); // 原子性地获取当前值
    }

    public static void main(String[] args) {
        AtomicIntegerExample example = new AtomicIntegerExample();

        // 模拟多线程环境
        for (int i = 0; i < 1000; i++) {
            new Thread(() -> example.increment()).start();
        }

        // 等待所有线程执行完毕
        // ...(此处省略等待所有线程完成的代码)

        System.out.println("Final count: " + example.getCount()); // 应该接近1000
    }
}

在上面的例子中,多个线程同时调用increment()方法来增加count的值,由于incrementAndGet()是原子操作,因此不会出现线程安全问题。

四、AtomicLong

AtomicLong类提供了对long类型的原子操作,其使用方式与AtomicInteger类似。

4.1 使用案例

import java.util.concurrent.atomic.AtomicLong;

public class AtomicLongExample {
    private AtomicLong sequenceNumber = new AtomicLong(0);

    public long next() {
        return sequenceNumber.incrementAndGet(); // 原子性地获取并增加下一个序号
    }

    public static void main(String[] args) {
        AtomicLongExample example = new AtomicLongExample();

        // 演示获取几个序号
        for (int i = 0; i < 5; i++) {
            System.out.println("Next sequence number: " + example.next());
        }
    }
}

五、AtomicBoolean

AtomicBoolean类提供了对boolean类型的原子操作,其使用方式与前面的类类似。

5.1 使用案例

import java.util.concurrent.atomic.AtomicBoolean;

public class AtomicBooleanExample {
    private AtomicBoolean flag = new AtomicBoolean(false);

    public void toggleFlag() {
        flag.set(!flag.get()); // 原子性地切换标志位的状态
    }

    public boolean isFlagSet() {
        return flag.get(); // 原子性地获取标志位的状态
    }

    public static void main(String[] args) {
        AtomicBooleanExample example = new AtomicBooleanExample();

        example.toggleFlag(); // 切换标志位的状态
        System.out.println("Is flag set? " + example.isFlagSet()); // 输出: Is flag set? true

        example.toggleFlag(); // 再次切换标志位的状态
        System.out.println("Is flag set? " + example.isFlagSet()); // 输出: Is flag set? false
    }
}

在上面的例子中,AtomicBoolean被用来存储一个标志位,通过toggleFlag()方法原子性地切换标志位的状态,并通过isFlagSet()方法原子性地获取标志位的状态。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。