在多线程环境中执行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由随附和掘金的作者所有。