当前位置: 首页 > 网络应用技术

JUC原子:ABA问题,原子类详细说明

时间:2023-03-08 14:42:47 网络应用技术

  在多线程环境中执行I ++并不能保证可变i.bby i.bby i ++的线程安全性实际上不是原子操作,而是由以下三个步骤组成:

  在多线程竞争环境中,以上三个步骤可以通过不同的顺序执行不同的线程,因此无法保证多线程I中变量I的线程I。在这种情况下,使用同步/锁和其他锁定方法以确保可以使用代码块来实现可变线程安全性。

  除锁定方法外,Java提供的13个原子操作还可以解决上述问题。Java中的13个原子操作基于锁定解决方案。

  Java.util.concurrent.Atomic软件包提供具有简单用法,高性能和线程安全性的原子操作。

  原子更新的基本类型主要如下:以下三个类别:

  使用AtomicInteger案例代码:

  原子续订数组是指原子方式中的索引位置的元素,主要包括以下三个类别:

  常用的方法是:

  以Atomicintegeraray的例子为例:

  让我们看一下源代码实现,其源代码如下:

  最终被称为不安全。

  原子更新参考类型包括以下三个类:

  这三个类提供的方法几乎相同。首先,构造一个参考对象,然后使用引号设置为原子类,然后调用一些方法来执行原子操作。该原则基于不安全。

  以原子量为例:

  结果输出:

  结果解释:

  原子更新字段类自然用于更新特定类中的字段值,该类主要包括以下四个类:

  使用步骤:

  例如:

  此外,使用AtomicIntegerFieldUpdater有一些限制和限制。约束如下:

  ABA问题发生在多线程环境中。当线程两次读取相同的内存地址时,获得的值两次相同。它简单地认为“此内存地址的值尚未被修改。”在这两个读取之间存在另一个线程,将存储地址从A到B进行了修改并将其重新修改。目前,“没有修改”显然是错误的。

  例如,这两个线程按以下顺序执行:

  (1)线程1读取内存位置x的值x;

  (2)线1块;

  (3)线程2读取内存位置的值x为a;

  (4)螺纹2修改内存位置的值x为b;

  (5)螺纹2的值修改,内存位置x为a;

  (6)线程1恢复,继续执行,并发现内存位置的值x设置为c;

  可以看出,对于线程1,第一个A和第二A和A实际上是相同的A。

  主维护包含一个配对对象,该对象可以自动更新整数“邮票”以解决ABA问题。

  案件:

  (1)注意在多线程环境中使用无锁的结构时,请注意ABA问题;

  (2)对ABA的一般版本数进行了控制,以使用元素值控制数据结构的值,并且每次添加元素时都会执行新节点的元素;

  (3)在内部使用对存储元素值及其版本编号;

  Atomicmarkablereree还可以解决ABA问题。它不是要维护版本号,而是要维护布尔类型标记。标记值具有修改和理解。

  参考:

  Java并发编程不锁CAS和不安全的类及其包装的原子

  作者:Corpirates由随附和掘金的作者所有。