悲观锁:使用synchronized是独占锁,即悲观锁,会导致其他需要锁的被挂起,等待持有锁的线程释放锁
乐观锁:每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败则重试,直到成功为止
CAS(Compare And Swap):比较并替换
java.util.concurrent包(简称JUC)就是建立在CAS上的,例如其中的AtomicInteger类,
import java.util.concurrent.atomic.AtomicInteger;
/**
* CAS(比较并交换)
*
*如果这个值没有被修改,则交换,如果被修改了,则交换失败
*/
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(()->{
//模拟网络延迟
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Integer left = stock.decrementAndGet();
if(left<1) {
System.out.println("抢完了");
return ;
}
System.out.println(Thread.currentThread().getName()+"抢了一件商品");
System.out.println("还剩"+left+"件");
}).start();
}
}
}
其中的一些方法底层便使用了CAS方法
在Unsafe类中提供了native方法,用于完成硬件级别的原子性操作,所以速度很快
另外,看到一篇不错的博文:CAS详解
如果想详细了解的话可以看看