CAS算法以及CAS在JUC包原子类的应用
1、CAS的引入
- i++不是原子操作
- 可以在synchronized代码块中使用i++来保证原子性,但是synchronized的获取锁和释放锁带来的上下文切换开销太大
- 可以通过原子类(AutomicLong)来保证原子性,同时原子类中使用了CAS算法,保证了不阻塞情况下实现原子操作
2、CAS介绍
-
CAS,compare and swap,也属于乐观锁的实现机制。 JAVA JDK中的unsafe类提供了一系列CAS操作。
3、JDK中的unsafe类
-
unsafe类中的方法都是本地(native)方法,通过访问本地的c++库来实现
unsafe类中的重要方法
1、compareAndSwapLong(Object obj, long offset, long expect, long update) //判断obj对象中偏移量为offset的变量的值是否等于expect。是的话把update赋值给这个变量,返回true;否则返回false
2、getAndSetLong(Object obj, long offset, long update){ long l; do{ l = getLongVolatile(obj, offset);//保证l的可见性 }while(!compareAndSwapLong(obj, offset, l, update)) return l; } //原子操作给变量赋值
3、getAndAddLong(Object obj, long offset, long addValue){ long l; do{ l = getLongVolatile(obj, offset);//保证l的可见性 }while(!compareAndSwapLong(obj, offset, l, l+addValue)) return l; } //原子操作i++
4、JUC包中的原子类——AtomicLong
-
JUC包中的原子类大量使用JDK提供的unsafe类,通过非阻塞的方式去实现原子操作 下面只以AtomicLong原子类为例介绍
AtomicLong的两个重要方法
incrementAndGet(){ return unsafe.getAndAddLong(this, valueOffset, 1L) + 1L; }
compareAndSet(long expect, long update ){ return unsafe compareA dSwapLong this valueOffset , expect , update) ; }
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
《重构 改善既有代码的设计》读书笔记一