Phinehasz Zhi

超越你看到的

java并发 无锁cas的最简单理解

无锁就是无障碍,多个线程竞争一定会有一个胜出
无锁在jdk是基于cas算法去实现的
cas:compare and swap
CAS算法:
一开始我也不理解CAS算法,再次学习终于理解了.现在给一个场景:
假设我有好几个线程,要去操作一个数据,比如库存值,我肯定得先读,读了后,我知道是10.
我也知道好几个线程同时去操作,改写肯定有并发问题,我想达到的效果是就一个线程成功操作,其他给我失败掉.
那此时我们知道预期值就是10,我的线程去竞争的时候就必须先读到数据,看看是不是10,如果是10,那这个线程就可以修改这个数据.
按先来后到,后面的线程晚了一步的时候,肯定会发现数据不是10了,那就无法修改.这个就是cas操作.
在cas里面,预期值是多少我觉得是最重要的,实现方式也有很多,比如多个线程去读,那在这些线程操作之前先有一个线程读,比如说主线程.
这样就实现了一个无锁,也就是不需要在多线程进来竞争的时候再加锁了.当然也会有别的资源损耗,这都是可以接受的.
CAS学习的疑惑:
很显然,读了上面的一段话,就会觉得一开始还要先读,读的时候还要求其他线程都先别动,似乎操作很麻烦.从算法层面来讲,
先读 -> 再多个线程来竞争,是有点麻烦的.但是CAS的应用中,在jvm里它是一个底层原子性的操作(CPU操作),你可以理解为先读的时候自然做到其他线程不会也进来读.CAS的操作的原子一样不可分割的.
JAVA中的无锁类:
所谓无锁类,就是在底层使用这种cas指令的类.一般认为,有锁的方式就是阻塞的方式,阻塞 -> 线程挂起,是进入临界区之前系统来给它挂起.
无锁类的学习可以参考别的资源.
posted @ 2018-08-11 10:48  phinehasz  阅读(272)  评论(0编辑  收藏  举报