内存模型与多线程技术

上传人:cl****1 文档编号:569186651 上传时间:2024-07-28 格式:PPT 页数:48 大小:161.50KB
返回 下载 相关 举报
内存模型与多线程技术_第1页
第1页 / 共48页
内存模型与多线程技术_第2页
第2页 / 共48页
内存模型与多线程技术_第3页
第3页 / 共48页
内存模型与多线程技术_第4页
第4页 / 共48页
内存模型与多线程技术_第5页
第5页 / 共48页
点击查看更多>>
资源描述

《内存模型与多线程技术》由会员分享,可在线阅读,更多相关《内存模型与多线程技术(48页珍藏版)》请在金锄头文库上搜索。

1、研究院淄分猪甚椰粤擎傀装厄近转半海愉磁驻星颧奠群饱霹兑艘云泪遥猫票炮隘内存模型与多线程技术内存模型与多线程技术java内存模型与多线程技术yangjsalibaba-把驹拯旷甭恭怔千孺铰香谆峨砸柠骸乎薄芹清耽茎岭吃南旗晦窘纽井拆喀内存模型与多线程技术内存模型与多线程技术研究院主要内容和目的学习java多线程理论基础:JMM(java内存模型)学习java多线程技术基础:理解同步是如和工作分析程序什么时候需要同步澄清对volatile误解,正确使用TaskCancellationandThreadShutdown策略LazyinitializationSafety技术征叮总儡酮梆肖蝶昔脊褒酶士淑

2、扑靴喧鸵龙扔琼珍眷形骋来晌所刘巨稗不内存模型与多线程技术内存模型与多线程技术研究院JMM(java内存模型)1.什么是Java内存模型2.Java内存模型相关概念3.java线程和内存交互行为定义4.Ordering&visibility5.JMM相关java语言规范嗡衰穴奇彰惟苟宛翼完圆啪锗倡滞索涣掐误姓已秦拄畅晕践蹦阎悦疮兹翁内存模型与多线程技术内存模型与多线程技术研究院内存模型操作平台的内存模型寄存器,CPU缓存,物理内存,虚拟内存缓存一致性模型顺序一致性模型顺序一致性模型:要求对某处理机所写的值立即进行传播,在确保该值以被所有处理机接受后才能继续其他指令的执行释放一致性模型释放一致性模

3、型:允许将某处理机所写的值延迟到释放锁时进行传播掣肖灾摸顿戈靳夷嗣雹捞特佩醚核式删殖枝渗罢枢磷重服玲心受哦貌雏外内存模型与多线程技术内存模型与多线程技术研究院Java内存模型(JMM)内存存管理的跨平台统一的模型write-once,run-anywhereconcurrentapplicationsinJava定义了Java线程和内存交互的规则通过一组语义规则来描述尤其是多线程之间共享内存的模式,保证多线程程序结果的可预测,语义一致性不同于其他语言,同平台无关所有的实例变量,静态变量和数组元素数组元素都存放在堆内存里线程本地变量在堆栈中,不受JMM影响与皋秸伎期碍豢投悦佛钱厌腰辅筏县吓搜霖句

4、敏醇隔株焚关讲绘钟忻蕉狄内存模型与多线程技术内存模型与多线程技术研究院Java内存模型相关概念Threadworkingcopymemory1.在java规范中这是一个抽象的概念,对应可能会是寄存器,cpu缓存,编译及执行优化等。2.一个新产生的Thread有一个空的workingmemory。3.类似一个高速缓存4.线程之间无法相互直接访问,变量传递均需要通过主存完成Themainmemory就是我们所说的java堆内存Threadsexecutionengine保证线程的正确执行顺序蝴瘪慧彭弘食辫玉牟圣臂览红骋躯霹瓦疗消匪鬃振行脏把殿注狠柒认泞妇内存模型与多线程技术内存模型与多线程技术研究

5、院java线程和内存交互行为定义JLS中对线程和主存互操作定义了6个行为,分别为load,save,read,write,assign和use,这些操作行为具有原子性,且相互依赖,有明确的调用先后顺序Auseaction(byathread)transfersthecontentsofthethreadsworkingcopyofavariabletothethreadsexecutionengine.Anassignaction(byathread)transfersavaluefromthethreadsexecutionengineintothethreadsworkingcopyofa

6、variable.Areadaction(bythemainmemory)transmitsthecontentsofthemastercopyofavariabletoathreadsworkingmemoryforusebyalaterloadoperation.Aload action(byathread)putsavaluetransmittedfrommainmemorybyareadactionintothethreadsworkingcopyofavariable.Astore action(byathread)transmitsthecontentsofthethreadswo

7、rkingcopyofavariabletomainmemoryforusebyalaterwriteoperation.Awriteaction(bythemainmemory)putsavaluetransmittedfromthethreadsworkingmemorybyastoreactionintothemastercopyofavariableinmainmemory.哄撩枷吃壮踩嗽溺忧抹秀皱漓穴锯渣扣仟灿拘临验诛症佛痊卯迷毋中漱芳内存模型与多线程技术内存模型与多线程技术研究院java线程和内存交互分析例子分析:classSimple inta=1,b=2;/Thread1exe

8、cutes voidto() a=3;b=4; /Thread2executes voidfro()System.out.println(a=+a+,b=+b); 类似计算机多级存储器结构,WorkingMemory类似Cache机制问题:变量a,b何时写会mainmemory?哗抱智寺雹傻颖县鸯有踌梅触搅邱咽烙抿絮碴斗惩幕守彰蜀脆废入挣陈媳内存模型与多线程技术内存模型与多线程技术研究院Ordering&visibility 程序顺序:程序声明它们应当发生的顺序执行顺序:JMM不保证线程对变量操作发生的顺序和被其他线程看到的是同样的顺序。JMM容许线程以写入变量时所不相同的次序把变量存入主存线

9、程内部本身遵循程序顺序,从线程外看到的是执行顺序编译器和处理器可能会为了性能优化,进行重新排序程序执行为了优化也可能重新排序冻辛索销酮抉獭宛垮来俘藉浸孩职屉迈季戮英卿础剂腺博穆罩妆舀般书子内存模型与多线程技术内存模型与多线程技术研究院Ordering&visibility多线程场景分析classSimpleinta=1,b=2;/Thread1executesvoidto()a=3;/Thiscanappeartohappensecondb=4;/Thiscanappeartohappenfirst/Thread2executesvoidfro()System.out.println(a=+a

10、+,b=+b);下面哪种结果是正确的:a=1,b=2a=1,b=4a=3,b=2a=3,b=4勒宽倘晶哑任铱俐皋竹柿音袁疗汲绢陶如整榆淌脑障皆盛谩协驭绦幼作诬内存模型与多线程技术内存模型与多线程技术研究院Happens-Before Memory Model类似释放一致性模型类似释放一致性模型Partialordering(happens-before):如果B能够看到A动作产生的结果,我们说Ahappens-beforeB,JMM定义了一些这样的规则,如:Program order rule.Eachactioninathreadhappens-beforeeveryactioninthat

11、threadthatcomeslaterintheprogramorder.Monitor lock rule.Anunlockonamonitorlockhappens-beforeeverysubsequentlockonthatsamemonitorlock.Volatile variable rule.Awritetoavolatilefieldhappens-beforeeverysubsequentreadofthatsamefield物卸傣壹佣滓恭热洱嚣凭迁需坍寐卜范曼田凿佃堰铬王桓问抹铀瑰览峰杏内存模型与多线程技术内存模型与多线程技术研究院The rules for happe

12、ns-before 剁俊溶炭钵许螟吟邦腋勤酮健妄乐徘只猛逆晦攀渴憨纸倚寄以终盎授渝韵内存模型与多线程技术内存模型与多线程技术研究院JMM相关java语言规范JMM定义了保证内存操作跨线程的正确的Ordering和visibility方法Java语言提供的技术和工具synchronized块volatile变量(在JDK5+的JVM中得到修补)工具类:java.util.concurrent.locks原子变量java.util.concurrent.atomicFinal变量(在JDK5+的JVM中得到修补)膘谓瓦哺慰档芯杖硝图搪白稍笔簿淑属漠停玄址刮扳蛊仆烯刮锗喜什融肥内存模型与多线程技术内

13、存模型与多线程技术研究院正确的理解synchronized1.synchronized作用说明2.Synchronized内存模型语义分析3.如何判定多线程的程序何时需要Synchronized4.同步需求的JMM内存交互分析练习5.锁对象的引用在同步块中发生修改会出现什么?6.HostspotJVM的synchronized优化技术7.直接使用synchronized不足之处孙恤舒猖安耘腮茎洽废剁遇谩睬无侨同袁吵敛谰振滤铸哀泣汉圾挣哭蔬孤内存模型与多线程技术内存模型与多线程技术研究院synchronized 作用说明Lowlevellocking什么时候需要synchronized?一个变量

14、有可能被多个线程访问,其中至少有一个线程是写操作每个对象对象都有一个相关的lock对象(监视器)java语言没有提供分离的lock和unlock操作,但是在JVM提供了两个单独的指令monitorenter和monitorext来实现特性Atomicity:LockingtoobtainmutualexclusionVisibility:Ensuringthatchangestoobjectfieldsmadeinonethreadareseeninotherthreads(memory)Ordering:Ensuringthatyouarentsurprisedbytheorderinwhi

15、chstatementsareexecutedBlocking:Cantinterrupt誓砒响绥虫教匆曲嫁邑闹牟诛皆寇苛察雄都氰膝跋锻坪茹饮拓垣衣作庐渴内存模型与多线程技术内存模型与多线程技术研究院Synchronized内存模型语义分析Synchronized:通过对象引用找到同步对象,然后获取对象上的监视器进行锁操作当线程进入synchronized块之后首先要做的是清洗threadsworkingmemory,对块内使用到的变量要么执行assign动作要么对use的变量执行read-load原子操作从mainmemory装载新的值当线程退出synchronized块之前,对它在work

16、ingmemory中所有的assignedvalues执行storewrite原子操作,写回mainmemory胁悬玉痢慕熙凝耸跌庙征龙缘歇言瘤段胸勺仗层音珠滥狐一捏悯婉策笨洱内存模型与多线程技术内存模型与多线程技术研究院Synchronized内存模型语义分析Example: /block until obtain locksynchronized(obj)/get main memory value of field1 and field2intx=obj.field1;inty=obj.field2;obj.field3=x+y;/commit value of field3 to ma

17、in memory/release lock军澜帖息搏型疲蔽酣者紊忍鱼坞架架首当补栖择咱鲜骑枷棠枫树菌馈浮巳内存模型与多线程技术内存模型与多线程技术研究院如何分析多线程并发需求classSynchSimpleinta=1,b=2;/Thread1executessynchronizedvoidto()a=3;b=4;/Thread2executesvoidfro()System.out.println(a=+a+,b=+b);以下哪种结果是正确的?a=1,b=2a=1,b=4a=3,b=2a=3,b=4这是一个线程安全的类吗?接下来我们通过JMM语义来分析这个例子茵亭珐兄注投苍碍惺羊睡考昨殃暮

18、犁朋蔼泵繁芳恍岛汛样亿眉讳滤焙耿层内存模型与多线程技术内存模型与多线程技术研究院JMM内存交互分析取瞬捧词惯伺殷朵齿罩漓汗墙勺谨瞻关袁禽塌亚绢趋邑豢汾诚浑腿榷阂淳内存模型与多线程技术内存模型与多线程技术研究院JMM内存交互分析SynchSimple分析:writea和writeb在synchronized规则中并没有规定发生的顺序约束reada和readb.同样也没有规定发生的顺序结果说明的什么问题?对一个方法声明synchronized并不能够保证这个方法行为产生的结果是一个原子操作,也就是说writea和writeb两个操作在mainmemory不是原子行为,虽然单个都是原子操作。下面我们

19、做一个练习:鸵岛证凳铸汀潦蔬力弧涂虫极勘彼私互厂巫雀风嫂位窘晰铣公乔疗逐甥佬内存模型与多线程技术内存模型与多线程技术研究院JMM内存交互分析练习Example:classFoo inta=1,b=2; synchronizedvoidto()a=3;b=4; synchronizedvoidfro()System.out.println(a=+a+,b=+b); 分析结果是什么?簧膛截域沥旋塔祝唯扩讼膊箩让乳榷江峡弃直馋纬回退砾持啪央疽辙钟哼内存模型与多线程技术内存模型与多线程技术研究院问题?这个方法的同步块有可能被多个线程并发执行!这个方法的同步块有可能被多个线程并发执行!有可能在有可能在i

20、ntArr.length size的条件下获得两把不同的锁的条件下获得两把不同的锁锁对象的引用在同步块中发生修改会出现什么?锁对象的引用在同步块中发生修改会出现什么?publicvoidfoo(intisze)synchronized(intArr)if(intArr.lengthsize)intnewIntArr=newintsize;System.arraycopy(intArr,0,newIntArr,0,intArr.length);intArr=newintArr;磷稍愤马捶遍腕芋职锗摔耍肌芝苯秆湿武植虹煤辆沪参丧屉亲啄在钩饲项内存模型与多线程技术内存模型与多线程技术研究院直接使用s

21、ynchronized 不足之处和发展不能够扩越多个对象当在等待锁对象的时候不能中途放弃,直到成功等待没有超时限制Thread.interrupt()不能中断阻塞JDK5中提供更加灵活的机制:Lock和Conditionsynchronized在JDK6中性能将会有很大提升毖篡窗蚤猿非悄头瘴例乔乍得辛乍波蜜昏账就跌优乐幸隐捍半观扦苗咀佯内存模型与多线程技术内存模型与多线程技术研究院Hostspot JVM的synchronized优化技术锁省略锁省略:锁对象的引用时线程本地对象(线程的堆栈内的对象)publicStringgetStoogeNames()Vectorv=newVector();

22、v.add(Moe);v.add(Larry);v.add(Curly);returnv.toString();氮渣除晃带堰庞收苹鸣叙炽哭扶折凑触航暑留剃揣罩偿均阀丑被按鞘吓盼内存模型与多线程技术内存模型与多线程技术研究院Hostspot JVM的synchronized优化技术锁粗化:锁粗化:锁粗化就是把使用同一锁对象的相邻同步块合并的过程publicvoidaddStooges(Vectorv)v.add(Moe);v.add(Larry);v.add(Curly);屑莆幻渝邑梗汀晤飘拧力露褒凰哈尘冠恨摆巍碧感散泞妈疫乙茶牙媒呈民内存模型与多线程技术内存模型与多线程技术研究院Hostspo

23、t JVM的synchronized优化技术自适应锁优化技术自适应锁优化技术实现阻塞有两种的技术,即让操作系统暂挂线程,直到线程被唤醒,或者使用旋转(spin)锁。旋转锁基本上相当于以下代码:while (lockStillInUse);HotspotJVM可以对持有时间短的锁使用旋转,对持有时间长的锁使用暂挂。镊檄酮喧疽贮邀驱凉拔瓷落菩朽堤再桌奏蛊涣征焕屁则蜗翌痢通娄贫划仰内存模型与多线程技术内存模型与多线程技术研究院理解和使用理解和使用Volatile变量变量Volatile变量的内存模型分析变量的内存模型分析使用valatileJDK5的util.concurrent.atomic刃上岸

24、制恰绸校楼报棱迟短妖凡详逆匙胡型株幢扛飞戴谅茸河弧奖胜碴庆内存模型与多线程技术内存模型与多线程技术研究院Volatile变量的内存模型分析变量的内存模型分析“不要相信volatile”,这种说法已经过时旧的内存模型:保证读写volatile都直接发生在mainmemory中,线程的workingmemory不进行缓存仅仅保证这些volatile使用的价值和意义不大在新的内存模型下对volatile的语义进行了修补和增强如果当线程A写入volatile变量V而线程B读取V时,那么在写入V时,A可见的所有变量值现在都可以保证对B是可见的。结果就是作用更大的volatile语义,代价是访问volat

25、ile字段时会对性能产生了一点点的影响。(A volatile var write happens-before read of the var)嚷滋烛庭综糯惮段曲攒醛饵撒共靴察衬檀成贼挽央乱樟渊煽覆谎发咬戎根内存模型与多线程技术内存模型与多线程技术研究院Volatile变量的内存模型分析变量的内存模型分析volatile的旧语义只承诺正在读和写的变量的可见性,仍然参与排序。这样导致排序问题。新的内存模型修补了这一点实际上,对volatile字段的每一次读或者写都像是“半个”同步。对volatile的读有与monitorenter的内存语义,对volatile的写有与monitorexit的同

26、样的语义。擎磋砾腊菠禹耗莫嘱昏犁酋炒哀骑罕酋镐啦整宋翰晃侯描淬凰棚兜食湛堑内存模型与多线程技术内存模型与多线程技术研究院Volatile Guarantees VisibilityStop用volatile修饰来保证变量的写可见性classTaskimplementsRunnableprivatevolatilebooleanstop=false;publicvoidstop()stop=true;publicvoidrun()while(!stop)runTask();tryThread.sleep(100);privatevoidrunTask()/*.*/焉觉傻侠疤锯痹蛮吧载胁关代启锡抗

27、巫码纽尔恤求沿糖搀锦荚梯疯相述脾内存模型与多线程技术内存模型与多线程技术研究院Volatile Guarantees OrderingIf a thread reads data, there is a happens-before edge from write to read of ready that guarantees visibility of data (A volatile ready write happens-before read of the ready)畅账赤利基削让涡巩恤赏沾翌乳何减颊乡晒狡屡饶戊膘凹列翅口靛枪曹天内存模型与多线程技术内存模型与多线程技术研究院使用v

28、alatile volatile变量+操作不是原子行为volatile int x= 1;x+;/不是一个原子操作,需要多条指令Volatile变量比synchronization要便宜很多在jdk5中推荐采用util.concurrent.atomic工作机制类似Volatile同时提供了简单运算的原子行为五嘎鹅碎志橱闷融粘庆椭迎灸撇逆绷应乐乎梳部妄扣鹃圈烘碗贸穴半貉悍内存模型与多线程技术内存模型与多线程技术研究院JDK5的util.concurrent.atomicget()具有读取volatile变量的内存效果。set()具有写入(分配)volatile变量的内存效果支持操作:getAn

29、dSetgetAndAddaddAndGetgetAndDecrementgetAndIncrementdecrementAndGetincrementAndGet只要你有足够的能力,用Atomic变量能够实现所有的同步磋国蠕澡认砌洽亏稿绕省压芯锗铅舆办座荔籽教仑赖我缠煤丙色正到戏墩内存模型与多线程技术内存模型与多线程技术研究院Cancellation and Shutdown1.CancellationandShutdown2.Taskcancellationpolicy设计3.Cancellationpolicy:Interruption4.正确处理InterruptedException

30、美隙涡拐篡酋个号腋褪儿迷桓熔绪涂秦务属而触萝漳仙院峨悲稍叶找于纬内存模型与多线程技术内存模型与多线程技术研究院Cancellation and Shutdowncleanupanyworkthenterminate.(Safeterminate)为什么需要cancellable(中断正在进行的活动)User-requestedcancellationTime-limitedactivitiesApplicationeventsErrorsShutdown安全快速可靠结束一个线程是一个比较复杂的话题Java没有提供安全的强迫一个Thread结束的方法Javaprovidesinterruptio

31、n,acooperativemechanism牌掖僚炕懦坍辜迅鄙戴函徘进练侧雾朋域硅椅搐堰鸯藉辽铺叁古沂已寨格内存模型与多线程技术内存模型与多线程技术研究院cancellation policy 设计How:howothercodecanrequestcancellationWhen:whenthetaskcheckswhethercancellationhasbeenrequestedWhat:whatactionsthetasktakesinresponsetoacancellationrequest.刘嚷傈盎欺械俭埔卿陷醇芬上半恿批旋锅伏酵阑育罚除伊缘咀萎泰条值康内存模型与多线程技术内存

32、模型与多线程技术研究院Example: cancellation policy 设计classTaskimplementsRunnableprivatevolatilebooleanstop=false;publicvoidstop()stop=true;publicvoidrun()while(!stop)runTask();tryThread.sleep(100);privatevoidrunTask()/*.*/绸览奢桔靠割康节愧赵晾欠供供荷某余钥如蕉缀肖绝臀瞳鸣获乡喊丛栏钧内存模型与多线程技术内存模型与多线程技术研究院Example: cancellation policy 设计分析H

33、ow,When,How?问题:pollingloops,只有一个检查点线程不能立刻结束,要等到检测的时候遇到Blockingmethod有可能无法中止检查的变量必须是volatile修饰的校珍饥总抒女恼咏芥疆罩预影蔡呻戌择缚祝峰错贺嫁光红高远案傣旬忠斌内存模型与多线程技术内存模型与多线程技术研究院Cancellation policy :Interruption 礼貌地劝告另一个线程在它愿意并且方便的时候停止它正在做的事情。(Interruptionisacooperativemechanism)Thread中断状态(interruptedstatus):线程的一个内部属性,类型:boolea

34、n,初始值:false.Thread.interrupt():设置interruptedstatus为true诲比驻渐鹏颓氧五标扑媒泉贫瘫域琳蚕宿区现檀夫钵均胶翁侦锡带宴急多内存模型与多线程技术内存模型与多线程技术研究院interruption Policy 分析分析:How:Thread.interrupt()方法.interrupt()只是设置线程的中断状态。表示当前线程应该停止运行。When:在Thread.sleep()、Thread.join()或Object.wait()等方法中取消阻塞并抛出InterruptedException,也可以程序检测:轮询中断状态:Thread.is

35、Interrupted()读取并清除:Thread.interrupted()InterruptibleChannel(java.nio):MoststandardChannelsimplementInterruptibleChannel等待获取文件锁定时可以被另一个线程中断审钎恰引腥栏阎力响吸察熊繁撒帅斤祟汪羹哈朗诉涵巫谎霉益惋阐仪历肩内存模型与多线程技术内存模型与多线程技术研究院Cancellation policy :InterruptionInterruptionisusuallythemostsensiblewaytoimplementcancellation其他问题不能打断一些IO

36、操作,比如文件操作无法终止在synchronized块上锁住的ThreadSynchronoussocketI/Oinjava.io涟搅釜氮住突存毙议衍袋裙弯胚长褂惨栗汀投颠馒餐优恿釉窖仆浓任仆胞内存模型与多线程技术内存模型与多线程技术研究院InterruptedException 检查型异常:检查型异常:java.lang.InterruptedException 当线程在很长一段时间内一直处于正在等待、休眠或暂停状态(Object.wait(),Object.wait(long),Object.wait(long,int),Thread.sleep(long)),而另一个线程用Thread

37、类中的interrupt方法中断它时,抛出该异常。阻塞(阻塞(blocking)方法方法方法签名包括抛出InterruptedException,调用一个阻塞方法则意味着这个方法也是一个阻塞方法当中断阻塞方法时,抛出当中断阻塞方法时,抛出InterruptedExceptionThread在Thread.sleep()和Object.wait()等方法中支持的取消机制,表明可以提前返回。当一个阻塞方法检测到中断并抛出InterruptedException时,它清除中断状态未棺辑务壁檬拟犯旬五垛敢柱睫抗蔬尚厄航茶牵匿艾逐勇缮思效走赡汐麻内存模型与多线程技术内存模型与多线程技术研究院如何处理In

38、terruptedException错误的做法:swallowinterruptionrequeststry Task task = queue.take(); task.execute(); catch (InterruptedException e) log.error(); 诛小爬坝场淡废念淄韦榷至酞艺枢滞奇尾见颊精解掂酉缝考缴朵姨簧滤移内存模型与多线程技术内存模型与多线程技术研究院如何处理InterruptedExceptionRestoretheinterrupt如果真的要湮灭InterruptedException,应该保留被别人中断的证据,交给高层去决定。/恰当的做法: try

39、Task task = queue.take(); task.execute(); catch (InterruptedException e) log.error(); Thread.currentThread().interrupt(); PropagatetheInterruptedException重新抛出它,如果抛到顶层,可以结束当前线程编剖途模返讼雍罚改掘会淡扦简鼠出葫释此误荒船芜沿汗辅楚戳派意踪窘内存模型与多线程技术内存模型与多线程技术研究院Double-Checked Locking目的:在多线程应用中用来lazyinitialization并保证Singlen在java语言中

40、DCL不成立/Brokenmultithreadedversion/Double-CheckedLockingidiomclassFooprivateHelperhelper=null;publicHelpergetHelper()if(helper=null)synchronized(this)if(helper=null)helper=newHelper();returnhelper;/otherfunctionsandmembers.撒雨芭睦挺渤欧奄湃赊期搔扼采袜为货孜浸倪涟劈邮沏涤温妊住伙拳建千内存模型与多线程技术内存模型与多线程技术研究院为什么在java语言中DCL不成立 Java构

41、造对象不是原子操作:1.先申请一块空内存2.将其地址赋予对象引用3.在对象引用所指的地址之上构建对象,调用构造函数初始化很多人提供了很多方法来修复DCL,但是没有人能够成功行为正确的程序,但是增加了同步的负担/Correctmultithreadedversion,butsynchronizedeverytime!classFooprivateHelperhelper=null;publicsynchronizedHelpergetHelper()if(helper=null)helper=newHelper();returnhelper;/otherfunctionsandmembers.畸

42、攒豪赫喳蛊侈朵剂淮郧瞄喳赶灸悸扑所霹另捍凛回哲术瑶吓遏铆图搓酚内存模型与多线程技术内存模型与多线程技术研究院Initialize-On-Demand Holder Class idiomprivatestaticclassLazySomethingHolderpublicstaticSomethingsomething=newSomething();.publicstaticSomethinggetInstance()returnLazySomethingHolder.something;审眼值访蕴浙诛镁必型瓶撇浑缕腐涛摈着谓仕趟忱了暂扇貉帚捉嫁奖坞剁内存模型与多线程技术内存模型与多线程技术研究院几点建议开发多线程系统一定要理解java的内存模型,那样你才能够正确地分析线程需求尽量使用现成的解决方案,util.concurrent优化的前提是保证程序的正确性,其次才是提高程序的性能缩小锁的作用范围缩短锁的存在时间庸桔等忘挫将灭趋卤逃网簧值浊周毕还歪卑晃懦硕幸并伞蹭拥咙瞩束两巴内存模型与多线程技术内存模型与多线程技术

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号