JUC学习之路(属性原子操作类)(五)

7 篇文章 0 订阅
5 篇文章 0 订阅

目录

AtomicLongFieldUpdater

        常用方法

        源码:

        范例:观察原子性的属性修改器

        范例:使用属性修改器


        在一个类之中可能会存在有若干个不同的属性,但是有可能在进行线程同步处理的时候,不是该类中所有的属性都会被进行所谓的同步操作,只有部分的属性进行同步处理操作,所以在J.U.C 提供的原子类型里面,就包含有一个属性修改器,利用属性修改器可以安全的修改属性的内容。原子开发包中属性修改器一共包含三种:AtomicIntegerFieldUpdater(原子整形成员修改器)、AtomicLongFieldUpdater(原子长整形修改器)、AtomicReferenceFieldUpdater(原子引用成员修改器)

AtomicLongFieldUpdater

        常用方法

首先AtomicLongFieldUpdater 是一个抽象类,所以如果要想使用那么必须找到其对应的实现子类,这个时候可以分析一下该类的源代码之中的定义。

        源码:

public abstract class AtomicLongFieldUpdater<T> {

    @CallerSensitive
    public static <U> AtomicLongFieldUpdater<U> newUpdater(Class<U> tclass,
                                                           String fieldName) {
        Class<?> caller = Reflection.getCallerClass();
        if (AtomicLong.VM_SUPPORTS_LONG_CAS)
            return new CASUpdater<U>(tclass, fieldName, caller);
        else
            return new LockedUpdater<U>(tclass, fieldName, caller);
    }

}

        按照以上结构的概念来讲是应该分为两种实现器的实现,一种是基于CAS 的方式实现的,另外一种是基于锁定的方式来实现的,而这两种实现是需要根据一些环境的参数来决定的

        范例:观察原子性的属性修改器

class BookLongFiled{
    // 1.属性必须使用 Volatile
    volatile long id;
}

public class AtomicLongFieldUpdaterTest {

    @Test
    public void longFiledTest(){
        // 通过newUpdater() 方法得到
        AtomicLongFieldUpdater longFieldUpdater
                = AtomicLongFieldUpdater.newUpdater(BookLongFiled.class,"id");
        System.out.println(longFieldUpdater.getClass());
    }
}

// 结果:class java.util.concurrent.atomic.AtomicLongFieldUpdater$CASUpdater

         此时默认的环境中,可以直接使用CAS的方式来实现修改器的对象实例获取,但是需要进行修改器处理的属性必须使用 volatile 关键字来进行定义,当然了,按照正常的使用来讲,此时的操作应该是在一个类的内部完成的。

        范例:使用属性修改器

class BookLongFiled {
    // 1.属性必须使用 Volatile,否者就会出现运行时异常
    private volatile long id;
    private String title;
    private double price;

    public BookLongFiled(long id, String title, double price) {
        this.id = id;
        this.title = title;
        this.price = price;
    }

    // 这个时候的 ID 是需要进行同步处理操作的
    public void setId(long id) {
        AtomicLongFieldUpdater updater = 
                AtomicLongFieldUpdater.newUpdater(BookLongFiled.class, "id");
        // CSA的修改操作
        updater.compareAndSet(this, this.id, id);
    }

    @Override
    public String toString() {
        return "【图书】ID:" + this.id + "、名称:" + this.title + "、价格:" + this.price;
    }
}

public class AtomicLongFieldUpdaterTest {
    @Test
    public void longFiledTest() {
        // 1、实例化 数据对象
        BookLongFiled book = new BookLongFiled(1002, "JUC 学习之路", 89.99);
        book.setId(1003);
        System.out.println(book);
    }
}


// 执行结果:【图书】ID:1003、名称:JUC 学习之路、价格:89.99

        在整个的J.U.C 的设计过程之中,不同的同步场景需要使用不同的原子类来完成处理的,除了要清除每一个原子类的使用特点之外,对于其实现的源码机制也要有认知

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倪家李子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值