广告
返回顶部
首页 > 资讯 > 精选 >浅谈Java中的atomic包实现原理及应用
  • 796
分享到

浅谈Java中的atomic包实现原理及应用

javaatomic原理 2023-05-30 18:05:28 796人浏览 薄情痞子
摘要

1.同步问题的提出假设我们使用一个双核处理器执行A和B两个线程,核1执行A线程,而核2执行B线程,这两个线程现在都要对名为obj的对象的成员变量i进行加1操作,假设i的初始值为0,理论上两个线程运行后i的值应该变成2,但实际上很有可能结果为

1.同步问题的提出

假设我们使用一个双核处理器执行A和B两个线程,核1执行A线程,而核2执行B线程,这两个线程现在都要对名为obj的对象的成员变量i进行加1操作,假设i的初始值为0,理论上两个线程运行后i的值应该变成2,但实际上很有可能结果为1。

我们现在来分析原因,这里为了分析的简单,我们不考虑缓存的情况,实际上有缓存会使结果为1的可能性增大。A线程将内存中的变量i读取到核1算数运算单元中,然后进行加1操作,再将这个计算结果写回到内存中,因为上述操作不是原子操作,只要B线程在A线程将i增加1的值写回到内存之前,读取了内存中i的值(此时i值为0),那么一定就会出现i的结果为1。因为A和B线程读取的i的值都为0,两个线程对它加1后的值都为1,两个线程先后将1写入到变量i中,也就是说i被两次写入的值都为1。

最通常的解决方法是两个线程中对i加1的代码用synchronize关键字对obj对象加。今天我们介绍一种新的解决方案,即使用Atomic包中的相关类来解决。

2.Atomic在硬件上的支持

在单处理器系统(UniProcessor)中,能够在单条指令中完成的操作都可以认为是"原子操作",因为中断只能发生于指令之间(因为线程的调度需要通过中断完成)。这也是某些CPU指令系统中引入了test_and_set、test_and_clear等指令用于临界资源互斥的原因。在对称多处理器(SymmetricMulti-Processor)结构中就不同了,由于系统中有多个处理器在独立地运行,即使能在单条指令中完成的操作也有可能受到干扰。

在x86平台上,CPU提供了在指令执行期间对总线加锁的手段。CPU芯片上有一条引线#HLOCKpin,如果汇编语言的程序中在一条指令前面加上前缀"LOCK",经过汇编以后的机器代码就使CPU在执行这条指令的时候把#HLOCKpin的电位拉低,持续到这条指令结束时放开,从而把总线锁住,这样同一总线上别的CPU就暂时不能通过总线访问内存了,保证了这条指令在多处理器环境中的原子性。当然,并不是所有的指令前面都可以加lock前缀的,只有ADD,ADC,AND,BTC,BTR,BTS,CMPXCHG,DEC,INC,NEG,NOT,OR,SBB,SUB,XOR,XADD,和XCHG指令前面可以加"LOCK"指令,实现原子操作。

Atomic的核心操作就是CAS(compareandset,利用CMPXCHG指令实现,它是一个原子指令),该指令有三个操作数,变量的内存值V(value的缩写),变量的当前预期值E(exception的缩写),变量想要更新的值U(update的缩写),当内存值和当前预期值相同时,将变量的更新值覆盖内存值,执行伪代码如下。

if(V == E){   V = U   return true }else{   return false }

--结束END--

本文标题: 浅谈Java中的atomic包实现原理及应用

本文链接: https://www.lsjlt.com/news/220581.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 浅谈Java中的atomic包实现原理及应用
    1.同步问题的提出假设我们使用一个双核处理器执行A和B两个线程,核1执行A线程,而核2执行B线程,这两个线程现在都要对名为obj的对象的成员变量i进行加1操作,假设i的初始值为0,理论上两个线程运行后i的值应该变成2,但实际上很有可能结果为...
    99+
    2023-05-30
    java atomic 原理
  • 浅谈express 中间件机制及实现原理
    简介 中间件机制可以让我们在一个给定的流程中添加一个处理步骤,从而对这个流程的输入或者输出产生影响,或者产生一些中作用、状态,或者拦截这个流程。中间件机制和tomcat的过滤器类似,这两者都属于责任链模式...
    99+
    2022-06-04
    浅谈 中间件 原理
  • 浅谈线性表的原理及简单实现方法
    一、线性表原理:零个或多个同类数据元素的有限序列原理图:特点 :有序性有限性同类型元素第一个元素无前驱,最后一个元素无后继,中间的元素有一个前驱并且有一个后继线性表是一种逻辑上的数据结构,在物理上一般有两种实现 顺序实现和链表实现二、基于数...
    99+
    2023-05-31
    线性表
  • Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理
    本文转自互联网本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看https://github.com/h3pl/Java-Tutorial喜欢的话麻烦点下Star哈文章将同步到我的个人博客:www...
    99+
    2023-06-02
  • 深入浅析java 中HashMap的实现原理
    这篇文章将为大家详细讲解有关深入浅析java 中HashMap的实现原理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1. HashMap的数据结构数据结构中有数组和链表来实现对数据的存储,...
    99+
    2023-05-31
    java hashmap ava
  • 浅析从同步原语看非阻塞同步以及Java中的应用
    目录一、从硬件原语上理解同步(非特指Java)1.1、基本硬件原语1.2、用一致性实现锁1.3、使用上面的旋转锁实现我们一个同步原语——栅栏同步二、Java中的原子性操作概述三、Ja...
    99+
    2022-11-12
  • 夯实Java基础系列20:从IDE的实现原理聊起,谈谈那些年我们用过的Java命令
    本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看https://github.com/h3pl/Java-Tutorial喜欢的话麻烦点下Star哈文章首发于我的个人博客:www.how2pla...
    99+
    2023-06-02
  • Java中的布隆过滤器原理实现和应用
    目录介绍实现初始化数据代码实现测试存在的数据不存在的数据介绍 本文全部代码地址 布隆过滤器是一种高效的数据结构,用于判断一个元素是否存在于一个集合中.它的主要优点是速度快,空间占用少...
    99+
    2023-05-17
    Java布隆过滤器使用 Java布隆过滤器实现
  • SPFA算法的实现原理及其应用详解
    目录一、前言二、SPFA 算法1、SPFA算法的基本流程2、代码详解三、SPFA 算法已死一、前言 SPFA算法,全称为Shortest Path Faster Algorithm,...
    99+
    2023-05-20
    SPFA算法原理 SPFA算法应用 SPFA算法
  • C#中的打印原理以及应用实例
    这篇文章主要讲解了“C#中的打印原理以及应用实例”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#中的打印原理以及应用实例”吧!C#打印原理其实就是生成MDI文件,那么什么是MDI文件呢?M...
    99+
    2023-06-17
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理
    目录布隆过滤器的原理在 Python 中使用布隆过滤器1、标准布隆过滤器。2、计数布隆过滤器。3、标准扩容布隆过滤器。4、计数扩容布隆过滤器。Redis 中使用布隆过滤器最后的话在开...
    99+
    2022-11-12
  • Java中JDBC连接池的基本原理及实现方式
    目录一、 应用程序直接建立数据库连接模型二、使用数据库连接池优化模型1、关于连接池中的连接数量的一些规定:2、编写数据库连接池创建数据库连接池:进一步封装一些相关数据库的类的方法三、...
    99+
    2022-11-12
  • Java中​HashMap的工作原理及实现方法是什么
    今天小编给大家分享一下Java中HashMap的工作原理及实现方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Has...
    99+
    2023-06-03
  • PHP 防抖技术的实现原理及其在项目中的应用
    防抖技术(Debounce)是一种常用于前端开发的技术,其作用是在某个事件被触发后,延迟执行相应的操作,直到事件停止触发一定时间后才真正执行。这种技术常被用于减少频繁触发事件带来的性能影响,提升用户体验。而在 PHP 中同样可以实现防抖技术...
    99+
    2023-10-21
    实现原理 项目应用 关键词:PHP 防抖技术
  • Java中锁的实现原理和实例用法
    这篇文章主要介绍“Java中锁的实现原理和实例用法”,在日常操作中,相信很多人在Java中锁的实现原理和实例用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中锁的实现原理和实例用法”的疑惑有所帮助!...
    99+
    2023-06-16
  • Java线程池实现原理及其在美团业务中的实践
     随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池ThreadPoolExecutor类,帮助开发人员管理线...
    99+
    2022-10-18
  • Python文件索引的实现原理及其在文件加载中的应用。
    Python文件索引的实现原理及其在文件加载中的应用 在Python中,文件是一种常见的数据类型,因此在应用程序中经常需要读写文件。当文件数量很大时,我们需要使用一种快速的方式来查找和访问文件。这时,文件索引就发挥了重要作用。本文将介绍Py...
    99+
    2023-09-28
    文件 索引 load
  • Spring中@DependsOn注解的作用及实现原理解析
    本文给大家讲解Spring中@DependsOn注解的作用及实现原理! 官方文档解释 Beans on which the current bean depends. Any be...
    99+
    2022-11-11
  • Java NIO多路复用的方法以及Linux epoll实现原理详解
    这篇文章主要介绍“Java NIO多路复用的方法以及Linux epoll实现原理详解”,在日常操作中,相信很多人在Java NIO多路复用的方法以及Linux epoll实现原理详解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作...
    99+
    2023-06-02
  • JAVA集合框架中的常用集合及其特点和实现原理简介
    本篇内容介绍了“JAVA集合框架中的常用集合及其特点和实现原理简介”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java提供的众多集合类由两...
    99+
    2023-06-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作