JUC系列02-原子变量与CAS算法

1 何为原子变量(Atomic)

1 计算机中的Atomic是指不能分割的最小单位。
2 JKD1.5之后java.util.concurrent.atomic包下提供了原子变量,主要的原子变量如下:
-- AtomicBoolean
-- AtomicInteger
-- AtomicIntegerArray
-- AtomicIntegerFieldUpdater
-- AtomicLong
-- AtomicLongArray
-- AtomicLongFieldUpdater
-- AtomicMarkableReference
-- AtomicReference
-- AtomicReferenceArray
-- AtomicReferenceFieldUpdater
-- AtomicStampedReference
3 原子变量的原子性由CAS(Compare and swap)算法保障原子性

/**
 * 多线程原子变量递增示例
 * 保证了原子性
 */
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

public class TestAtomic {

    public static void main(String[] args) {
        TestIncrement testIncrement = new TestIncrement();

        List threads = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Thread thread = new Thread(testIncrement);
            threads.add(thread);
            thread.start();
        }

        // 等待所有线程执行完
        for (Thread thread : threads) {
            try {
                thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        System.out.println(testIncrement.getNum());

    }
}

class TestIncrement implements Runnable {

    private AtomicInteger num = new AtomicInteger(0);

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            num.incrementAndGet();
        }
    }

    public AtomicInteger getNum() {
        return num;
    }
}

2 CAS算法

1 Java中原子变量的cas操作是由底层硬件保障的。
2 CAS的原理:顾名思义(比较并交换),即与期望值比较如果相同则交换并返回结果,否则重试直到成功为止。
3 优点:是一种乐观锁(区别于synchronized同步锁的一种乐观锁),使用非阻塞算法执行效率高。
4 主要缺点:高并发下如果与期望值比较成功率较低的情况下,会增加循环重试数,会给CPU带来额外开销。

来源:码蜂窝-JUC系列02-原子变量与CAS算法

你可能感兴趣的:(JUC系列02-原子变量与CAS算法)