JavaAPI-concurrent-基础知识

目录

目标

JDK版本

基础知识


目标

了解concurrent包前,需要先认识cas和volatile。

JDK版本

JDK8

基础知识

volatile关键字

保证内存可见性,写操作 happen-before 读操作。强制线程不缓存,每次均使用主存最新数据。

cas

api如unsafe.compareAndSwapXXX,由jvm提供实现,依赖处理器的原子性指令

sun.misc.Unsafe 单例模式

使用举例,以AtomicReference为例

    private static final Unsafe unsafe = Unsafe.getUnsafe();//获取单例

    private static final long valueOffset;//field相对偏移量

    static {
        try {
            valueOffset = unsafe.objectFieldOffset
                (AtomicReference.class.getDeclaredField("value"));//获取偏移量
        } catch (Exception ex) { throw new Error(ex); }
    }

    private volatile V value;//上述指的field

cas(A,B,C,D)参数说明

Afield所在对象
Bfield相对于对象内存空间首地址的相对偏移量
C期待的数值
D新数值

ABA问题

问题描述

一个线程1使用cas将数据从A改为B前,另一个线程使用cas将数据从A改为D然后又改为A,虽然线程1能执行成功,但是实际情况可能不符合预期结果。

解决方案

使用版本解决ABA问题,AtomicStampedReference

基于Pair模型

    private static class Pair<T> {
        final T reference;
        final int stamp;
        private Pair(T reference, int stamp) {
            this.reference = reference;
            this.stamp = stamp;
        }
        static <T> Pair<T> of(T reference, int stamp) {
            return new Pair<T>(reference, stamp);
        }
    }

cas逻辑,对比期待数据,设置新数据

    public boolean compareAndSet(V   expectedReference,
                                 V   newReference,
                                 int expectedStamp,
                                 int newStamp) {
        Pair<V> current = pair;
        return
            expectedReference == current.reference && // 当前数据必须等于期待数据
            expectedStamp == current.stamp &&         // 当前数据必须等于期待数据
            ((newReference == current.reference &&
              newStamp == current.stamp) ||           // 新数据已经被设置情况
             casPair(current, Pair.of(newReference, newStamp)));  // 设置新数据
    }

更多关于concurrent包的原理,请前往我的其他文章。

JavaAPI-concurrent-无锁API

JavaAPI-concurrent-有锁API

JavaAPI-Lock-简介

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值