Java Atomic2025年5月3日 | 阅读7分钟 在 Java 中,**原子变量**和**操作**用于并发。**多线程**环境在统一**并发**时会带来问题。共享实体(如对象和变量)在程序执行期间可能会被更改。因此,它们可能导致程序不一致。所以,在并发访问时照顾好共享实体非常重要。在这种情况下,**原子变量**可以解决这个问题。在本节中,我们将结合示例讨论**原子类、原子变量、原子操作**。 在继续本节之前,请确保您了解 Java 中的**线程**、**同步**和**锁**。 Java 原子类Java 提供了 **java.util.concurrent.atomic** 包,其中定义了原子类。原子类在单个变量上提供**无锁**和**线程安全**的环境或编程。它还支持原子操作。所有原子类都具有 get() 和 set() 方法,这些方法作用于 volatile 变量。这些方法与 volatile 变量的读写方式相同。 该包提供了以下原子类
这些类的对象分别代表 int、long、boolean 和对象引用的原子变量。原子类有一些通用方法如下
原子操作那些总是同时执行的操作称为**原子操作**或**原子动作**。所有原子操作要么有效地同时发生,要么根本不发生。与 Java 中的原子操作相关的**三个**关键概念如下 1. 原子性处理哪些操作以及一组操作具有**不可见性**。例如,考虑以下代码片段 在上面的代码中,并发运行 increment() 和 decrement() 的行为是**未定义**且**不可预测**的。 2. 可见性决定一个线程的效果何时可以被另一个线程**看到**。例如,考虑以下代码片段 在上面的代码中,即使线程 T1 设置 done 为 true,线程 T2 也可能永远不会停止。另外,请注意线程之间没有同步。 3. 排序决定一个线程中的操作相对于另一个线程的顺序。 字段 a 和 b 在线程 T2 中出现的顺序可能与它们在线程 T1 中设置的顺序不同。 让我们通过一个例子来理解。 在上面的代码片段中,我们声明了一个 int 类型变量 **count**,并在 incrementCount() 方法中将其设置为 1。在这种情况下,要么全部发生,要么根本不发生。因此,它表示一个**原子操作**,该操作称为**原子性**。 让我们看另一个代码片段。 看起来它也是一个原子操作,但事实并非如此。它是一个线性操作,由读、修改、写三个操作组成。因此,它可以部分执行。但如果在多线程环境中使用上述代码,会产生问题。 假设我们在单线程环境中调用了上述代码,count 的更新值为 2。如果我们通过两个单独的线程调用上述方法,它们都会同时访问变量并同时更新 count 的值。为了避免这种情况,我们使用原子操作。 Java 支持几种类型的原子操作,如下所示
让我们看看如何创建一个原子操作。 原子变量原子变量允许我们对变量执行原子操作。原子变量最小化了同步,并有助于避免内存一致性错误。因此,它确保了同步。 原子包提供了以下五个原子变量
原子变量的必要性让我们考虑以下代码。 Counter.java 输出 4 上述程序如果在单线程环境中执行,会给出预期的输出。多线程环境可能导致意外的输出。其原因在于,当两个或多个线程同时尝试更新值时,它们可能无法正确更新。 Java 提供了**两种**解决方案来克服这个问题
让我们创建一个 Java 程序并使用原子变量来克服这个问题。 使用原子变量AtomicExample.java 输出 4 同步 vs. 原子 vs. Volatile
下一个主题Java-program-to-rearrange-the-array-in-alternating-positive-and-negative-items-with-o1-extra-space |
Java 中的 for 循环和 for-each 循环的区别 循环只是一种重复执行特定代码块的方法,只要某个条件保持为真。编程语言通常提供不同类型的循环来处理重复,例如 while、...
阅读 6 分钟
在 Java 中,垃圾回收是一种提供自动内存管理的机制。它由 JVM 完成。程序员无需处理对象的分配和释放。在之前的章节中,我们还讨论了垃圾回收的工作原理。如果您还不熟悉…
5 分钟阅读
java.util 包包含 LongSummaryStatistics 类。在处理长整型流时,它接受 Long 对象集合,并且可能很有优势。它跟踪处理了多少值、它们加起来的总和以及其他...
阅读 4 分钟
如何在 Windows 10 中运行 Java 程序 要在 Windows 10 中运行 Java 程序,我们需要先安装 Java,然后设置环境变量。为此,请按照以下步骤操作 - 如何安装 Java?步骤 1) 访问 oracle 网站,然后...
阅读 2 分钟
Java 12 版本引入了 Switch 语句的模式匹配,并在 Java 13 版本中将其作为标准功能引入。让我们在以下段落中详细了解 Java 中的 Switch 模式匹配。它的主要目的是...
阅读 6 分钟
在 Java 中,final 和不可变性是与对象状态和修改相关的关键概念。这两个概念处理不同的方面,即对象及其状态是如何管理的。在本节中,我们将讨论 Java 中 final 和不可变性之间的区别。Java final 关键字 final 关键字在...
阅读 4 分钟
在面向对象编程领域,Java 是最受欢迎和最广泛使用的语言之一。Java 面向对象范例的核心是类和对象,而这些元素的核心是构造函数。构造函数是 Java 的一项基本功能,用于...
5 分钟阅读
Java 中的参数传递是指在方法或函数之间传输数据的机制。Java 支持两种类型的参数传递技术:值传递和引用传递。理解这些技术对于有效利用 Java 中的方法参数至关重要。参数类型:1. 正式参数:变量及其对应的数据类型是...
阅读 4 分钟
ExecutorService.execute() 和 submit() 方法用于将任务提交给 ExecutorService 对象。execute() 方法接受一个 Runnable 任务,而 submit() 方法接受 Runnable 和 Callable 任务。execute() 方法没有返回值,而 submit() 方法返回……
阅读 4 分钟
在数学和计算机科学中,顺序很重要,排列是一个引人入胜的主题。字符串中的排列定义为重新排列给定字符串中的字符以创建新的排列。在本节中,我们将讨论字符串排列...
5 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India