简介
锁的分类
- 悲观锁:synchronized是独占锁即悲观锁,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。
- 乐观锁:每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,知道成功为止。
Compare and Swap(比较并交换)
- 乐观锁的实现:有三个值,一个当前内存值V、旧的预期值A、将更新的值B。先获取到内存当中当前的内存值V,再将内存值V和原值A作比较,要是相等就修改为要修改的值B并返回true,否则什么都不做, 并返回false.
- CAS是一组原子操作,不会被外部打断。
- CAS属于硬件级别的操作(利用CPU的CAS指令,同时借助JNI来完成的非阻塞算法),效率比加锁操作高。
- ABA问题:如果变量V初次读取的时候是A,并且在准备赋值的时候检查到它仍然是A,那能说明它的值没有被其它线程修改过了吗?如果在这段时间内曾经被改为B,然后又改回A,那CAS操作就会误认为它从来没有被修改过。
代码测试
code:
import java.util.concurrent.atomic.AtomicInteger;
/**
* CAS:比较并交换
* @author dxt
*
*/
public class CAS {
//库存
private static AtomicInteger stock = new AtomicInteger(5);
public static void main(String[] args){
for(int i=0; i<5; i++){
new Thread(new Runnable(){
public void run(){
try {
Thread.sleep(100); //模拟一下延时
} catch (InterruptedException e) {
e.printStackTrace();
}
Integer left = stock.decrementAndGet();
if(left < 1){
System.out.println("抢完了");
return;
}
System.out.println(Thread.currentThread().getName() + "抢了一件商品" + "----还剩下" + left);
}
}).start();
}
}
}
result: