iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >java线程中Atomic的含义是什么
  • 245
分享到

java线程中Atomic的含义是什么

2023-06-19 10:06:02 245人浏览 安东尼
摘要

java线程中Atomic的含义是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Atomic概念      &n

java线程中Atomic的含义是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

Atomic概念

        计算机中的Atomic是指不能分割成若干部分的意思。如果一段代码被认为是Atomic,则表示这段代码在执行过程中,是不能被中断的。通常来说,原子指令由硬件提供,供软件来实现原子方法(某个线程进入该方法后,就不会被中断,直到其执行完成)

         在x86 平台上,CPU提供了在指令执行期间对总线加的手段。CPU芯片上有一条引线#HLOCK pin,如果汇编语言的程序中在一条指令前面加上前缀"LOCK",经过汇编以后的机器代码就使CPU在执行这条指令的时候把#HLOCK pin的电位拉低,持续到这条指令结束时放开,从而把总线锁住,这样同一总线上别的CPU就暂时不能通过总线访问内存了,保证了这条指令在多处理器环境中的原子性

jdk中的java.util.concurrent.atomic

            基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由JVM从等待队列中选择一个另一个线程进入,这只是一种逻辑上的理解。实际上是借助硬件的相关指令来实现的,不会阻塞线程(或者说只是在硬件级别上阻塞了)。

        其中的类可以分成4组

    • AtomicBoolean,AtomicInteger,AtomicLong,AtomicReference

    • AtomicIntegerArray,AtomicLongArray

    • AtomicLongFieldUpdater,AtomicIntegerFieldUpdater,AtomicReferenceFieldUpdater

    • AtomicMarkableReference,AtomicStampedReference,AtomicReferenceArray

Atomic类的作用

    • 使得让对单一数据的操作,实现了原子化

    • 使用Atomic类构建复杂的,无需阻塞的代码

      访问对2个或2个以上的atomic变量(或者对单个atomic变量进行2次或2次以上的操作)通常认为是需要同步的,以达到让这些操作能被作为一个原子单元。

2.1 AtomicBoolean , AtomicInteger, AtomicLong, AtomicReference

这四种基本类型用来处理布尔,整数,长整数,对象四种数据。

  • 构造函数(两个构造函数)

    • 默认的构造函数:初始化的数据分别是false,0,0,null

    • 带参构造函数:参数为初始化的数据

  • set( )和get( )方法:可以原子地设定和获取atomic的数据。类似于volatile,保证数据会在主存中设置或读取

  • getAndSet( )方法

    • 原子的将变量设定为新数据,同时返回先前的旧数据

    • 其本质是get( )操作,然后做set( )操作。尽管这2个操作都是atomic,但是他们合并在一起的时候,就不是atomic。在Java的源程序的级别上,如果不依赖synchronized的机制来完成这个工作,是不可能的。只有依靠native方法才可以。

  • compareAndSet( ) 和weakCompareAndSet( )方法

    • 这两个方法都是conditional modifier方法。这2个方法接受2个参数,一个是期望数据(expected),一个是新数据(new);如果atomic里面的数据和期望数据一致,则将新数据设定给atomic的数据,返回true,表明成功;否则就不设定,并返回false。

  • 对于AtomicInteger、AtomicLong还提供了一些特别的方法。getAndIncrement( )、incrementAndGet( )、getAndDecrement( )、decrementAndGet ( )、addAndGet( )、getAndAdd( )以实现一些加法,减法原子操作。(注意 --i、++i不是原子操作,其中包含有3个操作步骤:第一步,读取i;第二步,加1或减1;第三步:写回内存)

  • 代码示例

  • import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicBoolean;public class Test {public static void main(String[] args) throws InterruptedException {Test test = new Test();test.testAtomicBoolean();}private  AtomicBoolean wakeupPending = new AtomicBoolean(false);private  AtomicBoolean initialized = new AtomicBoolean(false);public void testAtomicBoolean() throws InterruptedException{// 实现只有一个线程在运行ExecutorService service = Executors.newCachedThreadPool();service.execute(new Worker("aa"));service.execute(new Worker("bb"));service.execute(new Worker("cc"));TimeUnit.SECONDS.sleep(2);}private class Worker implements Runnable {private String name;public Worker(String name) {this.name = name;init();}public void init() {if (initialized.compareAndSet(false, true)) {System.out.println("实现只初始化一次的功能");}}public void run() {while (true) {if (wakeupPending.compareAndSet(false, true)) {System.out.println(name + " enter");System.out.println(name + " working");System.out.println(name + " leave");try {TimeUnit.MILLISECONDS.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}wakeupPending.set(false);} else {// System.out.println(name + " give up");}}}}}

看完上述内容,你们掌握java线程中Atomic的含义是什么的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: java线程中Atomic的含义是什么

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

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

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

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

下载Word文档
猜你喜欢
  • java线程中Atomic的含义是什么
    java线程中Atomic的含义是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Atomic概念      &n...
    99+
    2023-06-19
  • Java线程池参数的含义是什么
    这篇文章给大家分享的是有关Java线程池参数的含义是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。java多线程开发时,常常用到线程池技术,这篇文章是对创建java线程池时的七个参数的详细解释。从源码中可以看...
    99+
    2023-06-29
  • MySQL中performance_schema.threads的线程ID含义是什么
    这篇文章主要介绍“MySQL中performance_schema.threads的线程ID含义是什么”,在日常操作中,相信很多人在MySQL中performance_schema.threads的线程ID...
    99+
    2024-04-02
  • java中namevaluepair的含义是什么
    NameValuePair是一个接口,用于表示一个名称-值对。它是Apache HttpClient库中的一部分,用于在HTTP请求...
    99+
    2024-02-29
    java
  • Python中下划线的含义是什么
    这篇文章给大家介绍Python中下划线的含义是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。格式例子作用及含义单下划线开头_var仅供内部使用,通常不会有python解释器强制执行末尾单下划线var_单个末尾下划线...
    99+
    2023-06-26
  • java中继承的含义是什么
    在Java中,继承是一种面向对象编程的机制,允许一个类(子类)基于另一个类(父类)来定义。通过继承,子类可以继承父类的属性和方法,从...
    99+
    2023-10-26
    java
  • java中public void的含义是什么
    在Java中,public void表示一个方法的访问修饰符和返回类型。具体含义如下:- public:表示该方法是一个公共方法,可...
    99+
    2024-02-29
    java
  • Java封装的含义是什么
    Java中的封装是一种面向对象的编程概念,它主要通过将数据和相关的方法集中起来,形成一个类,来实现数据的隐藏和保护。封装的含义包括以...
    99+
    2023-10-10
    Java
  • c++中::是什么含义
    作用域解析运算符 :: 用于指定标识符的作用域,并访问该作用域中的成员,包括:访问全局变量和函数访问类成员访问静态成员避免过度使用 ::,以保持代码的可读性和可维护性。 C++ 中 :...
    99+
    2024-04-26
    c++ 作用域
  • Java线程池7个参数的含义
    目录参数1:corePoolSize参数2:maximumPoolSize参数3:keepAliveTime参数4:TimeUnit参数5:BlockingQueue参数6:Thre...
    99+
    2024-04-02
  • linux中0号进程的含义是什么
    这篇文章主要介绍“linux中0号进程的含义是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“linux中0号进程的含义是什么”文章能帮助大家解决问题。在linux中,0号进程是指idle进程,是...
    99+
    2023-07-05
  • linux中stream的含义是什么
    这篇文章主要介绍“linux中stream的含义是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“linux中stream的含义是什么”文章能帮助大家解决问题。 ...
    99+
    2023-03-19
    linux stream
  • Android中property_get的含义是什么
    在Android中,property_get是一个用于获取系统属性值的函数。系统属性是一种存储在Android设备中的键值对数据,用...
    99+
    2024-02-29
    Android
  • linux中ll的含义是什么
    这篇文章主要讲解了“linux中ll的含义是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux中ll的含义是什么”吧!在linux中,“ll”是“ls -l”命令的别名,ls命令用...
    99+
    2023-06-29
  • Python中下划线有什么含义
    这篇文章主要为大家展示了“Python中下划线有什么含义”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python中下划线有什么含义”这篇文章吧。本文介绍了Python中单下划线和双下划线(&q...
    99+
    2023-06-20
  • HTML中input的含义是什么
    本文小编为大家详细介绍“HTML中input的含义是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“HTML中input的含义是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识...
    99+
    2024-04-02
  • Linux中点的含义是什么
    这篇文章主要介绍了Linux中点的含义是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Paul Brown 解释了 Linux shell 命令中那个不起眼的“点”的各种...
    99+
    2023-06-16
  • thinkphp中eq的含义是什么
    今天小编给大家分享一下thinkphp中eq的含义是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在thinkphp中,...
    99+
    2023-06-29
  • php中query的含义是什么
    这篇文章主要讲解了“php中query的含义是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php中query的含义是什么”吧!php中query是指一个查询方法,比如“mysql_qu...
    99+
    2023-07-04
  • internet中url的含义是什么
    这篇文章主要介绍了internet中url的含义是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇internet中url的含义是什么文章都会有所收获,下面我们一起来看看吧。...
    99+
    2023-03-06
    internet url
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作