一、描述
在日常的开发中,经常会出现多个线程去同时操作一个变量的情况。在这种情况下,我们经常会将此变量加上synchronized修饰符,来保证同一时间内只能有一个线程去访问修改该变量,但这样其他的县城都必须挂起,效率非常低。所以出现了一种新的思想:也就是CAS算法。
CAS算法全名为Compare And Swap 算法,即比较-替换算法。
这种算法有三个变量,内存地址的值V,旧的预期值A,要更新的目标值B
1、拿到最新内存地址的值
2、尝试将内存地址的值修改为更新的目标值B
3、若修改后目标值与预期值相等,则结束
4、若修改与预期值不等,则返回第一步
这样的实现的效果就是无限循环,直到数据被正确修改。
这样的好处就是没有为数据加锁,当然坏处也就是如果循环次数过多,则会负载过高。
二、在JAVA中的部分实现
1、ConcurrentHashMap
ConcurrentHashMap是最新的并发HashMap
其原理就是使用了CAS与部门加锁的原理
所以其效率比HashTable这种老式的并发集合要快得多。
2、atomic包
例如AtomicInteger等
当我们在给一个全局变量A进行自增操作时
曾经或许是这样去做
synchronized int a = 0;
//其它线程
a++;
但使用了AtomicInteger进行CAS算法自增时,可以改为如下代码
AtomicInteger ai = new AtomicInteger(0);
//其它线程
ai.getAndIncrement();