Atomic

学习一定要带着问题学习。

这个伪代码的场景是多个线程来启动一个进程,那我们知道一个进程只要被启动一次就可以了,以这个代码为切入点讲下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实现的。算了另起一篇文章。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容