Java 中的原子是什么?了解 Java 中的原子性和线程安全

java 中的原子是什么?了解 java 中的原子性和线程安全

1. %ignore_a_1% 原子简介

1.1 java 中什么是原子?

在 java 中,java.util.concurrent.atomic 包提供了一组支持对单个变量进行无锁线程安全编程的类。这些类统称为原子变量。最常用的原子类包括 atomicintegeratomiclongatomicbooleanatomicreference

原子变量被设计为以原子方式更新,这意味着它们的操作(例如递增、递减或比较和设置值)作为单个不可分割的步骤执行。这确保没有其他线程可以观察处于中间状态的变量。

示例:使用 atomicinteger

import java.util.concurrent.atomic.atomicinteger;public class atomicexample {    private atomicinteger counter = new atomicinteger(0);    public void incrementcounter() {        counter.incrementandget();    }    public int getcounter() {        return counter.get();    }    public static void main(string[] args) {        atomicexample example = new atomicexample();        for (int i = 0; i < 100; i++) {            new thread(example::incrementcounter).start();        }        // add some delay to ensure all threads complete        try {            thread.sleep(1000);        } catch (interruptedexception e) {            e.printstacktrace();        }        system.out.println("final counter value: " + example.getcounter());    }}

在此示例中,atomicinteger 用于维护一个计数器,该计数器可以由多个线程安全地递增,而不会导致不一致。

1.2 原子性和线程安全

术语“原子性”是指一步完成的操作,不存在其他操作干扰的可能性。在多线程上下文中,这意味着变量更新作为全有或全无操作发生。对于常规基元类型,诸如增量 (i++) 之类的操作不是原子的,这意味着如果多个线程尝试同时更新同一变量,可能会发生数据损坏。

立即学习“Java免费学习笔记(深入)”;

示例:原始类型的非原子操作

public class nonatomicexample {    private int counter = 0;    public synchronized void incrementcounter() {        counter++;    }    public int getcounter() {        return counter;    }    public static void main(string[] args) {        nonatomicexample example = new nonatomicexample();        for (int i = 0; i < 100; i++) {            new thread(example::incrementcounter).start();        }        // add some delay to ensure all threads complete        try {            thread.sleep(1000);        } catch (interruptedexception e) {            e.printstacktrace();        }        system.out.println("final counter value: " + example.getcounter());    }}

即使应用了同步,这种方法也可能因线程争用而导致性能瓶颈。然而,原子类通过使用低级 cpu 指令来避免这种情况,以确保原子性而不需要锁定。

2. 原子和常规基元之间的差异

现在我们了解了原子变量是什么以及它们如何发挥作用,让我们探讨一下它们在原子性和线程安全性方面与常规基元类型有何不同。

2.1 常规原语与原子中的原子性

常规基元,如 intlongboolean 等,本质上不是原子的。对这些变量的操作(例如递增或设置值)可能会被其他线程中断,从而导致数据不一致或损坏。相反,原子变量确保这些操作作为单个、不间断的步骤执行。

Waymark Waymark

Waymark是一个视频制作工具,帮助企业快速轻松地制作高影响力的广告。

Waymark 79 查看详情 Waymark

示例:原始类型的竞争条件

public class RaceConditionExample {    private int counter = 0;    public void incrementCounter() {        counter++;    }    public static void main(String[] args) {        RaceConditionExample example = new RaceConditionExample();        for (int i = 0; i < 1000; i++) {            new Thread(example::incrementCounter).start();        }        try {            Thread.sleep(1000);        } catch (InterruptedException e) {            e.printStackTrace();        }        System.out.println("Final Counter Value: " + example.counter);    }}

在此示例中,由于竞争条件,最终计数器值可能不是 1000。多个线程可以同时访问和修改计数器,从而导致不可预测的结果。

2.2 常规原语与原子中的线程安全

线程安全是并发编程中的一个关键考虑因素。常规基元需要显式同步才能保证线程安全,这可能很麻烦且容易出错。然而,原子本质上是线程安全的,因为它们提供内置的原子操作。

性能注意事项

由于获取和释放锁的开销,使用常规原语同步可能会导致性能瓶颈。另一方面,原子类提供了更高效的解决方案,通过使用非阻塞算法来实现无锁的线程安全。

三、结论

java 中的原子变量提供了一种强大而有效的方法来处理并发并确保数据一致性。它们在原子性和线程安全性方面与常规基元类型显着不同,在多线程环境中提供了更高效的解决方案。

通过理解原子的概念,你可以用java编写更安全、更高效的并发代码。如果您有任何疑问或需要进一步说明,请随时在下面发表评论!

阅读更多文章:什么是 java 中的原子?了解 java 中的原子性和线程安全

以上就是Java 中的原子是什么?了解 Java 中的原子性和线程安全的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1008043.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月1日 23:43:27
下一篇 2025年12月1日 23:43:48

相关推荐

发表回复

登录后才能评论
关注微信