并发编程-ABA问题

137 阅读1分钟

一、什么是ABA问题?

1. 理解一

当执行Compare and swap会出现失败的情况。例如:一个线程先读取共享内存数据值A,随后因某种原因,线程暂时挂起,同时另一个线程临时将共享内存数据值先改成B,随后又改为A,随后挂起线程恢复,通过CAS比较,最终比较结果将无变化。这样会通过检查。这就是ABA问题。

2. 理解二

假设T1线程工作时间为10s,T2线程工作时间为2s。那么可能在T1的工作期间,主内存中的共享变量A已经被T2线程修改了多次,只是恰好最后一次修改的值是该变量的初始值。虽然用CAS判定出来的结果是期望值,但却不是原来的那个了。

相当于只关心共享变量的起始值和结束值,而不关心过程中共享变量是否被其他线程动过。 有些业务可能不关心中间过程,但是有些业务要求变量在中间过程不能修改。

只靠CAS无法解决ABA的问题,需要使用原子引用才能解决。

  • AtomicMarkableReference(通过引入一个 boolean来反映中间有没有变过);
  • AtomicStampedReference(通过引入一个 int 来累加来反映中间有没有变过)