课件juc并发编程原子操作类_第1页
课件juc并发编程原子操作类_第2页
课件juc并发编程原子操作类_第3页
课件juc并发编程原子操作类_第4页
课件juc并发编程原子操作类_第5页
免费预览已结束,剩余14页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第21章:JUC并发编程原子操作类原子类在java.util.concurrent.atomic包中提供的原子操作类可以分为四类:基本类型:AtomicInteger、AtomicLong、AtomicBoolean;数组类型:AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray;引用类型:AtomicReference、AtomicStampedReference、AtomicMarkableReference;对象的属性修改类型:AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdaterAtomicLong常用方法No.方法类型描述1publicAtomicLong​(longinitialValue)构造设置初始化操作的数据内容2publicfinallongget()普通获取包装数据内容3publicfinalvoidset​(longnewValue)普通设置新数据内容4publicfinalvoidlazySet​(longnewValue)普通等待当前操作线程执行完毕后再设置新内容5publicfinalbooleancompareAndSet​(longexpectedValue,longnewValue)普通如果当前值等于“expectedValue”则进行设置,并返回true,如果不等则不修改并返回false6publicfinallonggetAndIncrement()普通获取原始数据并执行数据自增7publicfinallonggetAndDecrement()普通获取原始数据并执行数据自减8publicfinallongincrementAndGet()普通获取自增后的数据9publicfinallongdecrementAndGet()普通获取自减后的数据范例:使用AtomicLong进行原子性操作packagecn.mldn.demo;importjava.util.concurrent.atomic.AtomicLong;public

classJUCDemo{

public

static

voidmain(String[]args){ AtomicLongnum=newAtomicLong(100L);//实例化原子操作类

num.addAndGet(200);//增加数据并取得

long

curr=num.getAndIncrement();//先获取而后再自增 System.out.println(curr);//自增之前的内容 System.out.println(num.get());//自增之后的内容 }}范例:利用多线程操作数据packagecn.mldn.demo;importjava.util.concurrent.TimeUnit;importjava.util.concurrent.atomic.AtomicLong;public

classJUCDemo{

public

static

voidmain(String[]args)throwsException{ AtomicLongnum=newAtomicLong(100);//实例化原子操作类

for(int

x=0;x<10;x++){

newThread(()->{

num.addAndGet(200);//增加数据并取得 }).start(); } TimeUnit.SECONDS.sleep(2);//休眠2秒,等待执行结果 System.out.println(num.get());//自增之后的内容 }}范例:判断并设置新内容packagecn.mldn.demo;importjava.util.concurrent.atomic.AtomicLong;publicclassJUCDemo{ publicstaticvoidmain(String[]args)throwsException{ AtomicLongnum=newAtomicLong(100L);//实例化原子操作类 System.out.println(pareAndSet(100L,300L));//内容相同,返回true System.out.println(num.get());//内容为300 }}AtomicReferenceArray类常用方法No.方法类型描述1publicAtomicReferenceArray​(intlength)普通定义初始化数组长度2publicAtomicReferenceArray​(E[]array)普通定义初始化数组数据3publicfinalintlength()普通获取保存数组长度4publicfinalEget​(inti)普通获取指定索引数据5publicfinalvoidset​(inti,EnewValue)普通修改指定索引数组内容6publicfinalbooleancompareAndSet​(inti,EexpectedValue,EnewValue)普通判断(==判断)并修改指定索引数据7publicfinalEgetAndSet​(inti,EnewValue)普通获取并修改指定索引数据范例:使用AtomicReferenceArray类操作packagecn.mldn.demo;importjava.util.concurrent.atomic.AtomicReferenceArray;publicclassJUCDemo{ publicstaticvoidmain(String[]args)throwsException{ Stringinfos[]=newString[]{"","",""}; AtomicReferenceArray<String>array=newAtomicReferenceArray<String>(infos); //在使用compareAndSet()方法进行比较时,是通过“==”方式实现的比较操作 System.out.println(pareAndSet(0,"","")); System.out.println(array.get(0)); }}AtomicReference类常用方法No.方法类型描述1publicAtomicReference​(VinitialValue)构造传入初始化引用对象2publicfinalVget()普通获取保存对象3publicfinalvoidset​(VnewValue)普通修改保存对象引用4publicfinalbooleancompareAndSet​(VexpectedValue,VnewValue)普通比较(==比较)并修改对象,比较成功可以修改并返回true,否则返回false不修改5publicfinalVgetAndSet​(VnewValue)普通获取并设置新的对象引用范例:使用AtomicReference操作引用数据packagecn.mldn.demo;importjava.util.concurrent.atomic.AtomicReference;classMember{ privateStringname; privateintage; publicMember(Stringname,intage){ =name; this.age=age; } //setter、getter、无参构造、toString()略}publicclassJUCDemo{ publicstaticvoidmain(String[]args)throwsException{ MembermemA=newMember("mldn",12);//实例化Member实例 MembermemB=newMember("小李老师",18);//实例化Member实例 AtomicReference<Member>ref=newAtomicReference<Member>(memA); pareAndSet(memA,memB);//修改当前保存数据 System.out.println(ref);//输出当前数据内容 }}AtomicStampedReference类常用方法No.方法类型描述1publicAtomicStampedReference​(VinitialRef,intinitialStamp)构造初始化引用数据并设置初始化版本号2publicVgetReference()普通获取数据引用3publicintgetStamp()普通获取版本号4publicbooleancompareAndSet​(VexpectedReference,VnewReference,intexpectedStamp,intnewStamp)普通依据版本号和内容进行比较,比较成功后可以体进行内容与版本号替换,成功返回true5publicvoidset​(VnewReference,intnewStamp)普通无条件设置新内容与新版本号6publicbooleanattemptStamp​(VexpectedReference,intnewStamp)普通无其它线程操作时进行内容与版本号设置范例:使用AtomicStampedReference进行引用原子性操作packagecn.mldn.demo;importjava.util.concurrent.atomic.AtomicStampedReference;//Member类不再重复定义、略...publicclassJUCDemo{ publicstaticvoidmain(String[]args)throwsException{ MembermemA=newMember("mldn",12);//实例化Member实例 MembermemB=newMember("小李老师",18);//实例化Member实例 //由于AtomicStampedReference需要提供有版本号,所以在初始化时定义版本编号为1 AtomicStampedReference<Member>ref=newAtomicStampedReference<Member>(memA,1); //在进行CAS操作时除了要设置替换内容之外,也需要设置正确的版本号,否则无法替换 pareAndSet(memA,memB,1,2); System.out.println(ref.getReference());//输出当前数据内容 System.out.println(ref.getStamp());//获取版本号 }}AtomicMarkableReference类常用方法No.方法类型描述1publicAtomicMarkableReference​(VinitialRef,booleaninitialMark)构造设置初始化保存内容与初始化标记2publicVgetReference()普通获取保存数据3publicbooleanisMarked()普通标记判断4publicbooleancompareAndSet​(VexpectedReference,VnewReference,booleanexpectedMark,booleannewMark)普通根据原始内容与标记进行判断,如果判断成功则进行内容修改并设置新的标记5publicvoidset​(VnewReference,booleannewMark)普通无条件修改数据与标记6publicbooleanattemptMark​(VexpectedReference,booleannewMark)普通无其它线程操作时修改数据与标记范例:使用AtomicMarkableReference进行标记原子性操作packagecn.mldn.demo;importjava.util.concurrent.atomic.AtomicMarkableReference;//Member类不再重复定义、略...publicclassJUCDemo{ publicstaticvoidmain(String[]args)throwsException{ MembermemA=newMember("mldn",12);//实例化Member实例 MembermemB=newMember("小李老师",18);//实例化Member实例 //由于AtomicMarkableReference需要提供标记位才可以进行判断 AtomicMarkableReference<Member>ref=newAtomicMarkableReference<Member>(memA,true); //在进行CAS操作时除了要设置替换内容之外,也需要设置标记号,否则无法替换 pareAndSet(memA,memB,true,false); System.out.println(ref.getReference()); //输出当前数据内容 }}AtomicLongFieldUpdater类常用方法No.方法类型描述1publiclongaddAndGet​(Tobj,longdelta)构造加法操作2publicabstractbooleancompareAndSet​(Tobj,longexpect,longupdate)普通比较并修改数据3publiclongget​(Tobj)普通获取数据4publiclonggetAndSet​(Tobj,longnewValue)普通获取保存数据并设置新内容5publiclongdecrementAndGet​(Tobj)普通属性自减并获取内容6publiclongincrementAndGet​(Tobj)普通属性自增并获取内容范例:实现属性操作packagecn.mldn.demo;importjava.util.concurrent.atomic.AtomicLongFieldUpdater;classBook{ privatevolatilelongid; //必须使用volatile定义 privateStringtitle; publicBook(longid,Stringtitle){ this.id=id; this.title=title; } publicvoidsetId(longid){ AtomicLongFieldUpdater<Book>atoLong=AtomicLongFieldUpdater .newUpdater(Book.class,"id"); pareAndSet(this,this.id,id); } //setter、getter、无参构造、toString()略}publicclassJUCDemo{ publicstaticvoidmain(String[]args)throwsException{ Bookbook=newBook(10001,"Java开发实战经典"); book.setId(2003); System.out.println(book); }}并发计算使用原子操作类可以保证多线程并发访问下的数据操作安全性,而为了进一步加强多线程下的计算操作,所以从JDK1.8之后开始提供有累加器(DoubleAccumulator、LongAccumulator)和加法器(DoubleAdder

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论