Update Atomic.md
This commit is contained in:
parent
0ad4e236cb
commit
4b46e2eb23
|
@ -64,7 +64,56 @@ Atomic 翻译成中文是原子的意思。在化学上,我们知道原子是
|
|||
- AtomicIntegerFieldUpdater:原子更新整型字段的更新器
|
||||
- AtomicLongFieldUpdater:原子更新长整型字段的更新器
|
||||
- AtomicStampedReference :原子更新带有版本号的引用类型。该类将整数值与引用关联起来,可用于解决原子的更新数据和数据的版本号,可以解决使用 CAS 进行原子更新时可能出现的 ABA 问题。
|
||||
- AtomicMarkableReference:原子更新带有标记的引用类型。该类将 boolean 标记与引用关联起来,也可以解决使用 CAS 进行原子更新时可能出现的 ABA 问题。
|
||||
- AtomicMarkableReference:原子更新带有标记的引用类型。该类将 boolean 标记与引用关联起来,~~也可以解决使用 CAS 进行原子更新时可能出现的 ABA 问题。~~
|
||||
|
||||
> 修正: **AtomicMarkableReference 不能解决ABA问题**
|
||||
|
||||
```java
|
||||
/**
|
||||
|
||||
AtomicMarkableReference是将一个boolean值作是否有更改的标记,本质就是它的版本号只有两个,true和false,
|
||||
|
||||
修改的时候在这两个版本号之间来回切换,这样做并不能解决ABA的问题,只是会降低ABA问题发生的几率而已
|
||||
|
||||
@author : mazh
|
||||
|
||||
@Date : 2020/1/17 14:41
|
||||
*/
|
||||
|
||||
public class SolveABAByAtomicMarkableReference {
|
||||
|
||||
private static AtomicMarkableReference atomicMarkableReference = new AtomicMarkableReference(100, false);
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
Thread refT1 = new Thread(() -> {
|
||||
try {
|
||||
TimeUnit.SECONDS.sleep(1);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
atomicMarkableReference.compareAndSet(100, 101, atomicMarkableReference.isMarked(), !atomicMarkableReference.isMarked());
|
||||
atomicMarkableReference.compareAndSet(101, 100, atomicMarkableReference.isMarked(), !atomicMarkableReference.isMarked());
|
||||
});
|
||||
|
||||
Thread refT2 = new Thread(() -> {
|
||||
boolean marked = atomicMarkableReference.isMarked();
|
||||
try {
|
||||
TimeUnit.SECONDS.sleep(2);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
boolean c3 = atomicMarkableReference.compareAndSet(100, 101, marked, !marked);
|
||||
System.out.println(c3); // 返回true,实际应该返回false
|
||||
});
|
||||
|
||||
refT1.start();
|
||||
refT2.start();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
**CAS ABA 问题**
|
||||
- 描述: 第一个线程取到了变量 x 的值 A,然后巴拉巴拉干别的事,总之就是只拿到了变量 x 的值 A。这段时间内第二个线程也取到了变量 x 的值 A,然后把变量 x 的值改为 B,然后巴拉巴拉干别的事,最后又把变量 x 的值变为 A (相当于还原了)。在这之后第一个线程终于进行了变量 x 的操作,但是此时变量 x 的值还是 A,所以 compareAndSet 操作是成功。
|
||||
|
|
Loading…
Reference in New Issue