对于volatile对象的原子更新

AtomicReferenceFieldUpdater这个对象进行原子更新的时候,外部操作对象只能是public,因为外部访问不到private对象,但是在内内部确可以自己封装一个compareAndSet

package disruptor.test;

import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;

import org.junit.Test;

/**
* 基于反射的实用工具,可以对指定类的指定 volatile 字段进行原子更新。该类用于原子数据结构,该结构中同一节点的几个引用字段都独立受原子更新控制。
* @author xiaof
*
* compareAndSet(T obj, V expect, V update)
* obj - 有条件地设置其字段的对象
* expect - 预期值
* update - 新值
* 如果当前值 == 预期值,则以原子方式将此更新器管理的给定对象的字段设置为给定的更新值。对 compareAndSet 和 set 的其他调用,此方法可以确保原子性,但对于字段中的其他更改则不一定确保原子性
*
*/
public class AtomicReferenceFieldUpdaterTest { @Test
public void test1() {
AtomicReferenceFieldUpdater update = AtomicReferenceFieldUpdater.newUpdater(Temp.class, String.class, "name2");
Temp temp = new Temp();
update.compareAndSet(temp, null, "66");
update.compareAndSet(temp, "661", "6677");
System.out.println(temp.name2);
update.compareAndSet(temp, "66", "6677");
System.out.println(temp.name2); //以下会报错
/*
AtomicReferenceFieldUpdater update2 = AtomicReferenceFieldUpdater.newUpdater(Temp.class, String.class, "name3");
update2.compareAndSet(temp, null, "321");
System.out.println(temp.name3);
update2.compareAndSet(temp, null, "3211");
System.out.println(temp.name3);
update2.compareAndSet(temp, "321", "32112");
System.out.println(temp.name3);
*/ temp.compareAndSetName(null, "cutter");
System.out.println("内部原子操作:" + temp.getName());
temp.compareAndSetName3(null, "point");
System.out.println("内部原子操作:" + temp.getName3()); } } class Temp {
private volatile String name;
public volatile String name2;
protected volatile String name3; public void compareAndSetName(String preValue, String name) {
AtomicReferenceFieldUpdater update = AtomicReferenceFieldUpdater.newUpdater(Temp.class, String.class, "name");
update.compareAndSet(this, preValue, name);
} public void compareAndSetName3(String preValue, String name) {
AtomicReferenceFieldUpdater update = AtomicReferenceFieldUpdater.newUpdater(Temp.class, String.class, "name3");
update.compareAndSet(this, preValue, name);
} public String getName() {
return this.name;
} public String getName3() {
return this.name3;
}
}

效果展示:

【并发】2、AtomicReferenceFieldUpdater初体验的更多相关文章

  1. Scala 深入浅出实战经典 第66讲:Scala并发编程实战初体验

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  2. Microsoft IoT Starter Kit 开发初体验

    1. 引子 今年6月底,在上海举办的中国国际物联网大会上,微软中国面向中国物联网社区推出了Microsoft IoT Starter Kit ,并且免费开放1000套的申请.申请地址为:http:// ...

  3. Java8初体验(一)lambda表达式语法

    感谢同事[天锦]的投稿.投稿请联系 tengfei@ifeve.com 本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘.因为本人也是刚刚开始学习Java8,所以文中肯定有错误和理解 ...

  4. Java8初体验(二)Stream语法详解

    感谢同事[天锦]的投稿.投稿请联系 tengfei@ifeve.com 上篇文章Java8初体验(一)lambda表达式语法比 较详细的介绍了lambda表达式的方方面面,细心的读者会发现那篇文章的例 ...

  5. node.js 初体验

    node.js 初体验 2011-10-31 22:56 by 聂微东, 174545 阅读, 118 评论, 收藏, 编辑 PS: ~ 此篇文章的进阶内容在为<Nodejs初阶之express ...

  6. 【阿里云产品公测】结构化数据服务OTS之JavaSDK初体验

    [阿里云产品公测]结构化数据服务OTS之JavaSDK初体验 作者:阿里云用户蓝色之鹰 一.OTS简单介绍 OTS 是构建在阿里云飞天分布式系统之上的NoSQL数据库服务,提供海量结构化数据的存储和实 ...

  7. JAVA 11初体验

    JAVA 11初体验 随着JAVA没半年发布一次新版本,前几天JAVA 11隆重登场.在JAVA 11中,增加了一些新的特性和api, 同时也删除了一些特性和api,还有一些性能和垃圾回收的改进. 作 ...

  8. 【Spark深入学习 -15】Spark Streaming前奏-Kafka初体验

    ----本节内容------- 1.Kafka基础概念 1.1 出世背景 1.2 基本原理 1.2.1.前置知识 1.2.2.架构和原理 1.2.3.基本概念 1.2.4.kafka特点 2.Kafk ...

  9. 高性能无锁队列 Disruptor 初体验

    原文地址: haifeiWu和他朋友们的博客 博客地址:www.hchstudio.cn 欢迎转载,转载请注明作者及出处,谢谢! 最近一直在研究队列的一些问题,今天楼主要分享一个高性能的队列 Disr ...

随机推荐

  1. 类型转化&WCF不同binding的区别

    需要使用队列时并且涉及多线程时使用ConcurrentQueue 这个性内比自己使用Queue并且配合lock要好很多 calcFactory = new ChannelFactory<ICal ...

  2. MFC连接MySQL数据库方法

    MFC连接数据库的三种方法: 1.ODBC(开放式数据互联) 2.OLEDB与ADO 3.用mysql为C语言提供的接口

  3. MySQL处理表字段小技巧

    MySQL利用正则函数替换值 update dateTest set date=REPLACE(date,'/','') where date REGEXP '\/'; SQL语句讲解: -- 将 所 ...

  4. IntelliJ IDEA 2017版 spring-boot搭建拦截器

    1.建立一个springboot-web项目 https://www.cnblogs.com/liuyangfirst/p/8298588.html 2.加入过滤接口 public class Log ...

  5. base_expr +: width_expr

    在Verilog-1995中,可以选择向量的任一位输出,也可以选择向量的连续几位输出,不过此时连续几位的始 末数值的index需要是常量.而在Verilog-2001中,可以用变量作为index,进行 ...

  6. user\db\table_privs\column_privs四张表的权限控制

    今天要做的测试是:user\db\table_privs\column_privs这四张权限表分别控制哪些级别的权限: 测试准备: [超级用户]root@'127.0.0.1' [操作库权限的用户]g ...

  7. 【慕课网实战】Spark Streaming实时流处理项目实战笔记十一之铭文升级版

    铭文一级: 第8章 Spark Streaming进阶与案例实战 黑名单过滤 访问日志 ==> DStream20180808,zs20180808,ls20180808,ww ==> ( ...

  8. Ng第十七课:大规模机器学习(Large Scale Machine Learning)

    17.1  大型数据集的学习 17.2  随机梯度下降法 17.3  微型批量梯度下降 17.4  随机梯度下降收敛 17.5  在线学习 17.6  映射化简和数据并行 17.1  大型数据集的学习 ...

  9. 20155326 2016-2017-2 《Java程序设计》第7周学习总结

    20155326 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 Lambda (1)如果使用JDK8的话,可以使用Lambda特性去除重复的信息. (2)在 ...

  10. 模式PK:命令模式VS策略模式

    1.概述 命令模式和策略模式的类图确实很相似,只是命令模式多了一个接收者(Receiver)角色.它们虽然同为行为类模式,但是两者的区别还是很明显的.策略模式的意图是封装算法,它认为“算法”已经是一个 ...