资源描述:
《java中的atomic包使用指南-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Java中的Atomic包使用指南-编程开发技术Java中的Atomic包使用指南原文出处:方腾飞Java从JDK1.5开始提供了java.util,concurrent,atomic包,方便程序员在多线程环境下,无锁的进行原了操作。原了变量的底层使用了处理器提供的原了指令,但是不同的CPU架构可能提供的原子指令不一样,也有可能需耍某种形式的内部锁,所以该方法不能绝对保证线程不被阻塞。Atomic包介绍在Atomic包里一共有12个类,四种原子更新方式,分别是原子更新基本类型,原子更新数组,原子更新
2、引用和原子更新字段。Atomic包里的类基木都是使用Unsafe实现的包装类。原子更新基本类型类用于通过原子的方式更新基本类型,Atomic包提供了以下三个类:•AtomicBoolean:原子更新布尔类型。•Atomiclnteger:原了更新整型。•AtomicLong:原了更新长整型。Atomiclnteger的常用方法如下:•intaddAndGet(intdelta):以原子方式将输入的数值与实例屮的值(Atomiclnteger里的value)相加,并返回结果•booleancompar
3、eAndSet(intexpect,intupdate):如果输入的数值等于预期值,则以原子方式将该值设置为输入的值。•intgetAndIncrement():以原子方式将当前值加1,注意:这里返冋的是H增前的值。•voidlazySet(intnewValue):最终会设置成newValue,使用lazySet设置值后,可能导致其他线程在之后的一小段时间内还是町以读到旧的值。关于该方法的更多信息可以参考并发网翻译的一篇文章《AtomicLong.lazySet是如何工作的?》•intgetAnd
4、Set(intnewValue):以原子方式设置为newValue的值,并返回旧值。Atomiclnteger例子代码如卜:importjava.uti1.concurrent.atomic・Atomiclnteger;publicclassAtomicIntegerTest{staticAtomidntegerai=newAtomicTnteger(1);publicstaticvoidmain(String[]args){System,out.print.ln(ai.getAndlncremen
5、t());System,out.printin(ai.get());输出12餐后甜点Atomic包提供了三种基本类型的原子更新,但是Java的基本类型里还有char,float和double等。那么问题來了,如何原了的更新其他的基木类型呢?Atomic包里的类基木都是使用Unsafe实现的,讣我们一起看下Unsafe的源码,发现Unsafe只提供了三种CAS方法,compareAndSwapObject,compareAndSwapInt和comparcAndSwapLong,再看AtomicBoo
6、lcan源码,发现其是先把Boolean转换成整型,再使用compareAndSwapInt进行CAS,所以原子更新double也可以用类似的思路來实现。原子更新数组类通过原了的方式更新数组里的某个元素,Atomic包提供了以卜•三个类:•AtomicIntegerArray:原子更新幣型数组里的元素。•AtomicLongArray:原了更新长整型数组里的元素。•AtomicReferenceArray:原子更新引用类型数组里的元素。AtomicIntegerArray类主要是提供原子的方式更新数
7、组里的整型,其常用方法如下•intaddAndGet(inti,intdelta):以原子方式将输入值与数组中索引i的元素相加。•booleancompareAndSet(inti,intexpect,intupdate):如果当前值等于预期值,则以原子方式将数组位置i的元素设置成update值。实例代码如下:publicclassAtomicIntegerArra^^Test{staticint[]value二newint[]{1,2};staticAtomicIntcgcrArrayai=new
8、AtomicIntcgcrArray(value);publicstaticvoidmain(String[]args){ai.getAndSet(0,3);System,out.println(ai.get(0));System・out・println(valuc[0]);}I输出31AtomicIntegerArray类需要注意的是,数组value通过构造方法传递进去,然后AtomicIntegerArray会将当前数组复制一份,所以当AtomicIntegerA