锁带来的问题
- 会造成线程挂起
- 会造成线程调度开销
- 如果一个线程死锁会造成其它都不能执行
硬件并发锁
现在的CPU提供了一些诸如测试并设置,比较并交换这样的原子操作指令,为我们的乐观锁提供了支持。
比较并交换 CAS
int oldvalue = v;
if(v == expertedValue) v = newValue;
return oldvalue;
通常的用法是,取出v然后进行一定的操作,通过CAS会写值。如:
public int increment(){
int v;
do{
v = cas.getValue();
}while(v != cas.compareAndSwap(v, v+1));
return v + 1;
JVM的支持
Java提供了一些原子类,能够把其中的方法改为硬件底层的锁机制, 如果不能则会使用自旋锁的方式,来完成这个功能。
ABA问题
http://hustpawpaw.blog.163.com/blog/static/184228324201210811243127/