AtomicInteger可以保证硬件上的原子操作

1.主要原理

CAS操作

在进行数据更新的时候,会进行与内存中的地址进行比较,若预期值与内存中的值相同,则进行数据上的更新,若值不同,则更新失败,  CAS就是Compare and Swap的意思,比较并操作

AtomicInteger主要是调用了Unsafe类中的  compareAndSwapInt 方法

2.源码:

public final int incrementAndGet() {for (;;) {int current = get();int next = current + 1;if (compareAndSet(current, next))return next;}}
public final boolean compareAndSet(int expect, int update) {return unsafe.compareAndSwapInt(this, valueOffset, expect, update);}

3.使用

 //获取当前的值public final int get()//取当前的值,并设置新的值public final int getAndSet(int newValue)//获取当前的值,并自增public final int getAndIncrement() //获取当前的值,并自减public final int getAndDecrement()//获取当前的值,并加上预期的值public final int getAndAdd(int delta)

4.不足之处

比较更新的这个值,无法进行判断内存的值是否是被别人更改过之后,再更改回来的,

例子:

线程1 先将data读入0,进行加工,加工之后数据为2

线程2 也读入data0, 进行加工,加工之后数据为1

现场3 也读入data1, 进行加工,加工之后数据为0

若线程1先开启。但是最后结束,那么进行  data预期值与内存中值进行比较的时候,就会有问题,因为内存中的数据data  0 已经不是线程1读取的时候的那个 data0 ,但是这个无法进行判断

这个不足之处的解决,可以使用:AtomicStampedReference

转载于:https://www.cnblogs.com/lizhiyan-world/p/6884971.html

无锁atomicInteger相关推荐

  1. JAVA 中无锁的线程安全整数 AtomicInteger介绍和使用

    转载自 http://blog.csdn.net/bigtree_3721/article/details/51296064 JAVA 中无锁的线程安全整数 AtomicInteger,一个提供原子操 ...

  2. Java并发基础:了解无锁CAS就从源码分析

    CAS的全称为Compare And Swap,直译就是比较交换.是一条CPU的原子指令,其作用是让CPU先进行比较两个值是否相等,然后原子地更新某个位置的值,其实现方式是基于硬件平台的汇编指令,在i ...

  3. Java并发编程,无锁CAS与Unsafe类及其并发包Atomic

    为什么80%的码农都做不了架构师?>>>    我们曾经详谈过有锁并发的典型代表synchronized关键字,通过该关键字可以控制并发执行过程中有且只有一个线程可以访问共享资源,其 ...

  4. Java并发基础:了解无锁CAS就从源码分析 1

    CAS的全称为Compare And Swap,直译就是比较交换.是一条CPU的原子指令,其作用是让CPU先进行比较两个值是否相等,然后原子地更新某个位置的值,其实现方式是基于硬件平台的汇编指令,在i ...

  5. 无锁HashMap的原理与实现

    http://coolshell.cn/articles/9703.html java.util.HashMap并不能直接应用于多线程环境.对于多线程环境中应用HashMap,主要有以下几种选择: 使 ...

  6. Java并发编程—无锁互斥机制及CAS原理

    目录 一.CAS简介 二.AtomicInteger代码演示 三.CAS 实现 四.弊端 一.CAS简介 在计算机科学中,比较和交换(Conmpare And Swap)是用于实现多线程同步的原子指令 ...

  7. java 高并发_Java 高并发之无锁(CAS)

    Java 高并发之无锁(CAS) 本篇主要讲 Java中的无锁 CAS ,无锁 顾名思义就是 以不上锁的方式解决并发问题,而不使用synchronized 和 lock 等.. 1. Atomic 包 ...

  8. 使用无锁的方式和有锁的方式的程序性能对比

    这里分别使用有锁和无锁两种方式,对一个数值进行增加,一直增加到100000,然后输出使用时间的长短. 1 import java.util.concurrent.ExecutorService; 2 ...

  9. 面试必备:CAS无锁机制

    CAS无锁机制原理,面试高频问题之一,其实,日常开发中并不会直接使用CAS无锁机制,都是通过一系列封装好的工具类来使用, 说不定面试官不提问,都不知道有这么个东西存在. 1.能说一下你对CAS的理解吗 ...

最新文章

  1. wpf listbox绑定不跟新_你知道新媒体吗?好像跟想象的不太一样
  2. java开发工具软件排行榜
  3. “华为云-东吴杯”圆满成功,顶尖参赛者推动“智造”场景结构升级
  4. 看美文,记单词(6)
  5. 【java基础知识】java.util.LinkedHashMap cannot be cast to com.XXX.XXX
  6. 原生JDBC连接MySQL数据库踩的坑
  7. 深度学习2.0-38.RNNCell使用-RNN Layer
  8. python字符串转成数组_python将字符串转换成数组的方法
  9. 2022年6月25日PMP考试通关宝典-4
  10. java kernel32.dll,关于kernel32.sys病毒的问题
  11. C语言 —— 合并两个有序数组
  12. 后氧传感器正常数据_怎么看氧传感器数据流
  13. gadget驱动框架(三)
  14. Github登录不上、下载慢的解决方法
  15. 网络游戏引入人工智能:游戏玩家并非真人
  16. python解一元二次方程ax^2+bx_python 练习题:定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程ax^2+bx+c=0的两个解...
  17. N行M列每个位置放Aij个1厘米的正方体,求表面积
  18. display和visibility的区别
  19. 托福高频真词List15 // 附托福TPO阅读真题
  20. 浩辰编写lisp_CAD二次开发

热门文章

  1. -------------------开启我的手残之旅---------我就是喜欢写笔记-------咋滴啦?-----
  2. iOS cell添加点击时改变字体的颜色及背景
  3. Comet杀人游戏开发日志-1(问题记录-于核心功能测试成功转向实际开发阶段)
  4. LeetCode(226)——翻转二叉树(JavaScript)
  5. 计算机网络学习笔记(17. 计算机网络作业一)
  6. 【零基础学Java】—多线程(四十九)
  7. 【Vue】—列表渲染v-for指令
  8. 【Vue】—Vue的模板语法
  9. 同一个行业为什么股票差异大?
  10. Qt——P19 资源文件添加