假设现在有这样的一个场景: 一百个线程同时对一个int对象进行修改,要求只能有一个线程可以修改。

看看下面程序是否正确:

    private static int a = 100;
private static volatile boolean ischanged = false;
public static void main(String[] args){
for(int i=0; i<100;i++){
Thread t = new Thread(new Runnable() {
@Override
public void run() {
if(!ischanged){
ischanged = true;
a = 120;
}
}
});
t.start();
}
}

对于volatile变量,写的时候会将线程本地内存的数据刷新到主内存上,读的时候会将主内存的数据加载到本地内存里,所以可以保证可见行和单个读/写操作的原子性。但是上例中先 1. 判断!ischanged 2.ischanged=true  该组合操作就不能保证原子性了,也就是说线程A A1->A2  线程B B1->B2(第一个操作为volatile读或者第二个操作为volatile写的时候,编译器不会对两个语句重排序,所以最后的执行顺序满足顺序一致性模型的),但是最后的执行结果可能是A1->B1->A2->B2。不满足需求

AtomicIntegerFieldUpdater:  基于反射的工具,可用CompareAndSet对volatile int进行原子更新:

修改上个场景的代码,如下:

public class Test{
private static AtomicIntegerFieldUpdater<Test> update = AtomicIntegerFieldUpdater.newUpdater(Test.class, "a");
private static Test test = new Test();
public volatile int a = 100;
public static void main(String[] args){
for(int i=0; i<100;i++){
Thread t = new Thread(new Runnable() {
@Override
public void run() {
if(update.compareAndSet(test, 100, 120)){
System.out.print("已修改");
}
}
});
t.start();
}
}
}
用AtomicIntegerFieldUpdater.newUpdater指定类里面的属性。这里我们要更新Test类里面的A字段(必须是volatile且不是static对象)。update.compareAndSet()方法使用cas机制,每次提交的时候都比较下test.a是不是100,如果是,则更新。

AtomicIntegerFieldUpdater使用的更多相关文章

  1. java多线程系类:JUC原子类:05之AtomicIntegerFieldUpdater原子类

    概要 AtomicIntegerFieldUpdater, AtomicLongFieldUpdater和AtomicReferenceFieldUpdater这3个修改类的成员的原子类型的原理和用法 ...

  2. LongAdder,AtomicIntegerFieldUpdater深入研究

    从LongAdder看更高效的无锁实现 AtomicIntegerFieldUpdater字段原子更新类 div:not([id]){display:none;} --> ul{padding: ...

  3. java并发编程:线程安全管理类--原子操作类--AtomicIntegerFieldUpdater<T>

    1.类 AtomicIntegerFieldUpdater<T> public abstract class AtomicIntegerFieldUpdater<T> exte ...

  4. AtomicIntegerFieldUpdater用法

    一个基于反射的工具类,它能对指定类的指定的volatile字段进行原子更新 下面是netty源码中AbstractReferenceCountedByteBuf类的使用 private static ...

  5. 并发之AtomicIntegerFieldUpdater

    基于反射的实用工具,可以对指定类的指定 volatile int 字段进行原子更新.此类用于原子数据结构,该结构中同一节点的几个字段都独立受原子更新控制. 先来看一段代码: package autom ...

  6. AtomicIntegerFieldUpdater字段原子更新类

    本文链接:https://blog.csdn.net/anLA_/article/details/78662383前面讲的两个AtomicInteger和AtomicIntegerArray,这两个都 ...

  7. AtomicIntegerFieldUpdater和AtomicInteger

    为什么有了AtomicInteger还需要AtomicIntegerFieldUpdater? 当需要进行原子限定的属性所属的类会被创建大量的实例对象, 如果用AtomicInteger, 每个实例里 ...

  8. AtomicIntegerFieldUpdater 源码分析

    AtomicIntegerFieldUpdater AtomicIntegerFieldUpdater 能解决什么问题?什么时候使用 AtomicIntegerFieldUpdater? 1)字段必须 ...

  9. java并发AtomicIntegerFieldUpdater

    java并发AtomicIntegerFieldUpdater 支持对象的成员变量原子操作类由AtomicIntegerFieldUpdater,AtomicLongFieldUpdater, Ato ...

随机推荐

  1. SpringMvc获取上下文

    import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.spri ...

  2. Oracle数据库补充

      约束: 什么是约束以及约束的作用: 为保证数据的完整性(一致性,准确性),需要对数据进行限制,这个限制就叫做约束 目的:保证数据的完整性(一致性,正确性),使数据符合业务规则(业务逻辑)   约束 ...

  3. 【模板】概率dp

    有n个投资事件,和一个成功概率最低接受值rate.每个投资的价值是c[i],成功概率是p[i](浮点数). 在保证成功概率≥rate的情况下,使价值最大化. #include<bits/stdc ...

  4. 洛谷P2052 [NOI2011]道路修建(树形DP)

    题目描述 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿 意修建恰好 n – 1 条双向道路. 每条道 ...

  5. poj_2249_Binomial Showdown

    In how many ways can you choose k elements out of n elements, not taking order into account? Write a ...

  6. ABAP术语-Field

    Field 原文:http://www.cnblogs.com/qiangsheng/archive/2008/02/01/1061244.html Name in an ABAP program f ...

  7. nigx配置location规则

    以下是收集的,对于不是很熟的朋友,配置转发很有帮助 1.location匹配命令和优先级: 优先级: Directives with the = prefix that match the query ...

  8. linux命令之压缩与归档

    1.   gzip:压缩工具 语法·:gzip [选项](参数) 命令说明:运用广泛的压缩程序,文件经它压缩后,其名称后面以“.gz”扩展名 常用命令选项: -N:压缩文件后,保留文件的原文件名和时间 ...

  9. npm install 报错

    今天准备在服务器上部署一下pm2,发现 npm install -g pm2   爆出了错误 error Unexpected end of JSON input while parsing near ...

  10. vue服务端渲染按需引入mint

    vue服务器渲染按需引入mint-ui 1.修改.babelrc文件,在.babelrc文件中plugins数组中添加 { "presets": [["es2015&qu ...