原子更新基本类型

原子更新数组

原子更新抽象类型

原子更新字段

原子更新基本类型:

package com.roocon.thread.t8;

import java.util.concurrent.atomic.AtomicInteger;import java.util.concurrent.atomic.AtomicIntegerArray;

public class Sequence {    private AtomicInteger value = new AtomicInteger(0);    private int [] s = {2,1,4,6};    AtomicIntegerArray a = new AtomicIntegerArray(s);

    public int getNext(){        a.getAndIncrement(2);//给下标为2的元素加1        a.getAndAdd(2, 10);//获取下标为2的元素,并且加10        for (int i=0; i < a.length(); i++){            System.out.println(a.get(i));        }        return value.getAndIncrement();    }

    public static void main(String[] args) {        Sequence sequence = new Sequence();        new Thread(new Runnable() {            @Override            public void run() {               while (true){                   System.out.println(Thread.currentThread().getName()+" "+sequence.getNext());                   try {                       Thread.sleep(100);                   } catch (InterruptedException e) {                       e.printStackTrace();                   }               }            }        }).start();        new Thread(new Runnable() {            @Override            public void run() {                while (true){                    System.out.println(Thread.currentThread().getName()+" "+sequence.getNext());                    try {                        Thread.sleep(100);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }            }        }).start();        new Thread(new Runnable() {            @Override            public void run() {                while (true){                    System.out.println(Thread.currentThread().getName()+" "+sequence.getNext());                    try {                        Thread.sleep(100);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }            }        }).start();    }}

运行结果:

Thread-0 0
Thread-1 1
Thread-2 2
Thread-0 3
Thread-1 4
Thread-2 5
...

package com.roocon.thread.t8;import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicIntegerArray;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
import java.util.concurrent.atomic.AtomicReference;public class Sequence {private AtomicInteger value = new AtomicInteger(0);AtomicReference<User> user = new AtomicReference<>(); //对user的set和get执行原子操作AtomicIntegerFieldUpdater<User> old =  AtomicIntegerFieldUpdater.newUpdater(User.class, "old");public int getNext(){User user = new User();System.out.println(old.getAndIncrement(user));System.out.println(old.getAndIncrement(user));System.out.println(old.getAndIncrement(user));return value.getAndIncrement();}public static void main(String[] args) {Sequence sequence = new Sequence();new Thread(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+" "+sequence.getNext());try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}).start();}
}

运行结果:

0
1
2
Thread-0 0

对CAS的源码理解:--初步理解

在AtomicInteger中有这样一段源码:

public final int getAndUpdate(IntUnaryOperator updateFunction) {int prev, next;do {prev = get();next = updateFunction.applyAsInt(prev);} while (!compareAndSet(prev, next));return prev;}
public final boolean compareAndSet(int expect, int update) {    return unsafe.compareAndSwapInt(this, valueOffset, expect, update);}
 

其中,compareAndSwap就是CAS的缩写。如果prev和next不相等,则返回true。否则,返回false。最终是通过unsafe来实现的。

以上代码表示,如果compareAndSet返回true,则while条件为false,退出循环,返回prev值。如果compareAndSet返回false,则while为true,继续执行循环体,重新获取prev的值,重新获取更新值,直到返回的compareAndSet值为true。

演示源码大致步骤如下:

 Object prev = get(); //1next = prev + 1;boolean flag = cas(prev, next);if (flag) {return prev;}else {go to 1}

转载于:https://www.cnblogs.com/sunnyDream/p/8137588.html

JDK提供的原子类原理与使用相关推荐

  1. JDK1.5提供的原子类原理及使用

    JDK提供的原子类原理及使用 volatile只能保障可见性,不能保障原子性,如value++操作,就不是一个原子性操作,value++共分为以下三步操作(假如value的值是0): 1.取出valu ...

  2. 高并发编程-07-JDK提供的原子类操作及原理

    1,原子类介绍: 针对数据类型的操作,JDK提供的原子类来方便我们的线程安全控制. 所有的类保存在 java.util.concurrent.atomic 包中 基本数据类型 AtomicIntege ...

  3. cas无法使用_【漫画】CAS原理分析!无锁原子类也能解决并发问题!

    本文来源于微信公众号[胖滚猪学编程].转载请注明出处 在漫画并发编程系统博文中,我们讲了N篇关于锁的知识,确实,锁是解决并发问题的万能钥匙,可是并发问题只有锁能解决吗?今天要出场一个大BOSS:CAS ...

  4. 并发笔记(八)JUC原子类以及线程池(Executors)

    一.原子类 JUC中提供了针对一个变量的修改的简单原子操作,提供了原子类,相对于我们自己采用锁的方式实现来说,原子类的性能更好. 1.1原子类的底层实现原理理论:volatile+(循环的CAS) C ...

  5. 16.Atomic原子类体系概览

    老王:小陈啊,从今天开始我们就要进入Atomic原子类系列的学习了,首先啊给你看一下JDK中提供给我们使用的原子类有哪些? 小陈:好啊,我记得JUC下面提供的原子类还是挺多的,所有的原子类的使用和底层 ...

  6. 6.Atomic原子类

    Atomic原子类 JUC包下提供的原子类底层的实现原理基本都是差不多的,都是基于volatile和CAS操作来保证线程安全的. AtomicInteger.AtomicLong整型的原子类 Atom ...

  7. Java中常用的原子类

    文章目录 一.什么是原子类 二.原子类的底层实现 三.常用的原子类 3.1.AtomicInteger与AtomicLong 3.2.LongAdder 四.原子类的性能测试 4.1.测试程序 4.2 ...

  8. JUC多线程:Atomic原子类与CAS原理

    一.Atomic 原子类的原理: Atomic 原子操作类是基于无锁 CAS + volatile 实现的,并且类中的所有方法都使用 final 修饰,进一步保证线程安全.而 CAS 算法的具体实现方 ...

  9. atomic原子类实现机制_JDK中Atomic开头的原子类实现原子性的原理是什么?

    JDK Atomic开头的类,是通过 CAS 原理解决并发情况下原子性问题. CAS 包含 3 个参数,CAS(V, E, N).V 表示需要更新的变量,E 表示变量当前期望值,N 表示更新为的值.只 ...

最新文章

  1. WSE 3.0 文档翻译:安装WSE3.0
  2. virtualenv创建python项目虚拟环境
  3. 1080 MOOC期终成绩 (25 分)
  4. 世纪互联云和华为共同打造的数据中心是一个很好的一步标志!
  5. Android学习笔记44:JSON数据解析
  6. 的优缺点_浅谈桉木家具的优缺点
  7. 插值法补齐缺失数据_数据处理——缺失值处理
  8. SQL2000系統表的應用
  9. 10个最好的免费响应式Joomla模板
  10. CTEX编译Xelatex以及如何更新Miktex
  11. 通过UDR扩展GBase8s查询行为的工程实践
  12. android版本5.1下载,嘉兴禾点点下载-禾点点 安卓版v5.1.1-PC6安卓网
  13. 精准营销的神器:小蜜蜂获客系统助你成功
  14. Flutter安装后出现HTTP host not reachable.
  15. Java常用的IO流
  16. python中什么的布尔值不是false_不是python中的布尔值
  17. java反编译+回编教程
  18. C#串口设计SerialPort类(维修电工Demo)
  19. linux 性能测试 antutu,跑分软件测试性能提升幅度
  20. NetDevice 配置转以太网模块 YC8000-FX的使用步骤

热门文章

  1. 在IDEA中为项目引入maven中央仓库中的依赖包
  2. STM32 BOOT0连接不当造成死机
  3. Android studio导出的apk在真机上安装提示“文件不存在或已失效”的解决方法
  4. caffe中mnist数据集的运行
  5. 录取5秒钟的KNN取景效果gif(Opencv) Python实现
  6. 【解决方案】本次安装Visual Studio 所用的安装程序不完整
  7. Numpy.tile() (Python)
  8. 使用OpenVINO遇到No name 'IENetwork' in module 'openvino.inference_engine'解决
  9. express快速入门
  10. 数据插入INSERT