学习一定要带着问题学习。
这个伪代码的场景是多个线程来启动一个进程,那我们知道一个进程只要被启动一次就可以了,以这个代码为切入点讲下Atomic

假如没有Atomic,要怎么实现这个场景,可以用同步锁

好,问题来了,compareAndSet这个方法的效果和加锁的效果是一致的,但是看上去他并没有加锁,那为什么我们自己实现一个这个逻辑为什么不行,比如我这么实现的

为啥?很明显这个方法多线程是不安全的,当多个线程同时到达1时判断成立,多个线程就都能走到2了。那jvm是怎么实现的这个本地方法呢?不知道!!!记住这个结论,java的CAS的是一条CPU的原子指令(cmpxchg指令),不会造成所谓的数据不一致问题。这个是jvm实现的CAS,如果我们自己想要实现这个逻辑,得先保证1和2是原子操作,显然我们自己写的java逻辑是不支持原子操作,除非加锁。
CAS还有个问题是ABA问题,ABA是啥,CAS有三个基本变量,内存地址V,预期值A,更改的新值B。问题的产生就是预期值被其他线程从A改为B又改为A,那当前线程比较的时候预期值还是A,结果更改成功,一般用版本号解决。我们看下java是怎么用AtomicStampedReference解决的。

可以看到线程3并没有成功将A成功修改为B,操作完之后期望值还是A。
讲完CAS,接着讲AQS吧,AQS是基于CAS实现的。算了另起一篇文章。