1.AtomicReference

        AtomicReference类提供了一个可以原子读写的对象引用变量。原子意味着尝试更改AtomicReference的多个线程(例如:比较和交换操作),不会是AtomicReference最终达到不一致的效果。
        AtomicReference有一个先进的方法compareAndSet(),它可以将引用和预期值(引用)进行比较,如果它们值相等,则在AtomicReference对象内设置一个新的引用。

2.概述

        自旋锁(spinlock):是指当一个线程在获取锁的时候,如果锁已经被其他线程获取,那么该线程将循环等待,然后不断地判断锁是否能够被成功获取,直到获取到锁才会推出循环。
        获取锁的线程一直处于活跃状态,但是并没有执行任何有效的任务,使用这种锁会造成busy-waiting。

3.自选锁存在的问题

        1.如果某个线程持有锁的时间过长,就会导致其他等待获取锁的线程进入循环等待,消耗CPU。使用不当会造成CPU使用率极高。
        2.上面Java实现的自旋锁是不公平的,即无法满足等待时间最长的线程有限获取锁。不公平的锁会存在“线程饥饿”问题。