为什么80%的码农都做不了架构师?>>>
CAS (compare and swap)包含三个参数,CAS(V,E,N),V表示要更新的变量,E表示期望的值,N表示新值,仅当V=E的时候才会将V的值设置为N,如果V值和E值不同,则证明其他线程做了更新,则当前线程什么也不做.
Java自旋锁应用-原子包
Jdk1.5以后,提供了Java.util.concurrent.atomic包,这个包里面提供了一组原子类。其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由 JVM从等待队列中选择一个另一个线程进入,这只是一种逻辑上的理解。实际上是借助硬件的相关指令来实现的,不会阻塞线程 (或者说只是在硬件级别上阻塞了 )。其中的类可以分成 4组
- AtomicBoolean,AtomicInteger,AtomicLong,AtomicReference
- AtomicIntegerArray,AtomicLongArray
- AtomicLongFieldUpdater,AtomicIntegerFieldUpdater,AtomicReferenceFieldUpdater
- AtomicMarkableReference,AtomicStampedReference,AtomicReferenceArray
我们来看一段AtomicBoolean中的自旋锁的代码
public final boolean getAndSet(boolean newValue) { for (;;) { boolean current = get(); if (compareAndSet(current, newValue)) return current; } }