JavaJUC之Atomic系列12大类实例讲解和原理分解-编程开发技术

JavaJUCZAtomic系列12大类实例讲解和原理分解-编程开发技术JavaJUC之Atomic系列12大类实例讲解和原理分解原文出处:xieyu_zy在java6以后我们不但接触到了Lock相关的锁,也接触到了很多更加乐观的原子修改操作,也就是在修改时我们只需要保证它的那个瞬间是安全的即可,经过相应的包装后可以再处理对象的并发修改,以及并发屮的ABA问题,木文讲述Atomic系列的类的实现以及使用方法,其中包含:基本类:Atomiclntcgcr>AtomicLong>AtomicBoolcan;引用类型:AtomicReference、AtomicReference的ABA实例、AtomicStampedRerence>AtomicMarkableReference;数组类型:AtomiclntegerArray、AtomicLongArray、AtomicReferenceArray属性原子修改器(Updater):AtomicIntegerFieldUpckiter>AtomicLongFicldUpdatcrxAtomicRefcrcnccFicldUpdater看到这么多类,你是否觉得很困惑,其实没什么,因为你只需耍看懂一个,英余的方法和使用都是大同小异的,相关的类会介绍他们之间的区别在哪里,在使用屮需要注意的地方即可。在使用Atomic系列前,我们需要先知道一个东西就是Unsafe类,全名为:sun.misc.Unsafe,这个类包含了大量的对C代码的操作,包括很多直接内存分配以及原子操作的调用,而它Z所以标记为非安全的,是告诉你这个里而大量的方法调用都会存在安全隐患,需要小心使用,否则会导致严重的后果,例如在通过unsafe分配内存的吋候,如果自己指定某些区域可能会导致一些类似C++—样的指针越界到其他进程的问题,不过它的具体使用并不是本文的重点,本文重点是Atomic系列的内容大多会基于unsafe类中的以卜'几个本地方法來操作:对象的引用进行对比后交换,交换成功返回true,交换失败返回false,这个交换过程完全是原了的,在CPU上计算完结果后,都会对比内存的结果是否还是原先的值,若不是,则认为不能替换,因为变量是volatile类型所以最终写入的数据会被其他线程看到,所以一个线程修改成功后,其他线程就发现自C修改失败了。参数对彖所在的类本身的对象(一般这里是对一个对彖的屈性做修改,才会出现并发,所以该对彖所存在的类也是有一个对彖的)参数2:这个屈性在这个对彖里而的相对便宜量位置,其实对比时是对比内存单元,所以需要属性的起始位置,而引用就是修改引用地址(根据OS、VM位数和参数配置决定宽度-般是4-8个字节),int就是修改相关的4个字节,而long就是修改相关的8个字节。获取偏移量也是通过unsafe的一个方法:objectFiclclOffset(Ficlclficlcl)来获取属性在对象屮的偏移量;静态变量需要通过:staticFieldOffset(Fieldfield)获取,调用的总方法是:fieldOffset(Fieldfield)参数3:修改的引用的原始值,用于对比原来的引用和要修改的目标是否一致。参数4:修改的口标值,要将数据修改成什么。publicfinalnativebooleancompareAndSwapObject(ObjectparamObjectl,longparamLong,Objectparam0bject2,Objectparam0bjcct3);publicfinalnativebooleancompareAndSwapInt(ObjectparamObject,longparamLong,intparamInll,iniparamTnt2);#对long的操作,要看VM是否支持对Long的CAS,因为有可能VM本身不支持,若不支持,此时运算会变成Lock方式,不过现在VM都基本是支持的而已。publicfinalnativebooleancompareAndSwapLong(ObjectparamObject,longparamLongl,longparamLong2,longparamLong3);我们不推荐直接使用unsafe来操作原子变量,而是通过java封装好的一些类来操作原子变量。实例代码1:AtomicIntegerTest.javaimportjava・uti1.concurrent.atomic・Atomiclnteger;publicclassAtomicIntegerTest{/***常见的方法列表*@seeAtomidnteger#get()*@seeAtomiclnteger#getAndAdd(int)化前的数据*@seeAtomicTntegertfgetAndDecreinent()减少1,返回减少询的数据*@seeAtomicIntegerftgetAndlncrement()增加1,返回增加前的数据*@seeAtomicIntegeriigetAndSet(int)设置指定的数据,返冋设置前的数据直接返[Hl值增加指定的数据,返冋变加后的数据*@seeAtomicInteger#decreinentAndGet()*@seeAtomicTntegeriiincrementAndGet()*@sccAtomiclntcgcr#lazySct(int)*@seeAtomicIntegeriicompareAndSet(...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供参考,付费前请自行鉴别。
3、如文档内容存在侵犯商业秘密、侵犯著作权等,请点击“举报”。

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

客服邮箱:

biganzikefu@outlook.com

所有的文档都被视为“模板”,用于写作参考,下载前须认真查看,确认无误后再购买;

文档大部份都是可以预览的,笔杆子文库无法对文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;

文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为依据;

如果您还有什么不清楚的或需要我们协助,可以联系客服邮箱:

biganzikefu@outlook.com

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

笔杆子文秘
机构认证
内容提供者

为您提供优质文档,供您参考!

确认删除?