在并发编程中,自旋锁(spin locks )想必大家都不陌生。
自旋锁一个非常经典的使用场景是CAS(即比较和交换),是一种无锁的思想(说白了就是使用了无限循环),用来解决更新数据的问题高并发场景。
atomic包下的很多类,如AtomicInteger、AtomicLong、AtomicBoolean等,都是用CAS实现的。
我们以AtomicInteger类为例,它incrementAndGet不会每次都给变量加 1。
<b>public</b> <b>final</b> <b>int</b> incrementAndGet() { <b>return</b> unsafe.getAndAddInt(<b>this</b>, valueOffset, 1) + 1; }
它的底层是用自旋锁实现的:
<b>public</b> <b>final</b> <b>int</b> getAndAddInt(Object <b>var</b>1, <b>long</b> <b>var</b>2, <b>int</b> <b>var</b>4) { <b>int</b> <b>var</b>5; <b>do</b> { <b>var</b>5 = <b>this</b>.getIntVolatile(<b>var</b>1, <b>var</b>2); } &