鏂囩珷閾炬帴锛氭繁鍏ョ悊瑙olatilevolatile鍘熺悊鍦↗ava骞跺彂缂栫▼涓璼ynchronized鍜寁olatile鎵紨鐫€閲嶈鐨勮鑹诧紝volatile鏄竴涓交閲忕骇鐨剆ynchronized锛屽畠淇濊瘉浜嗗澶勭悊鍣ㄥ紑鍙戜腑鍏变韩鍙橀噺鐨勫彲瑙佹€у拰鍙鎬х▼搴忔墽琛岀殑鏈夊簭鎬с€傚鏋渧olatile浣跨敤寰楀綋锛屼娇鐢ㄥ拰鎵ц璧锋潵姣攕ynchronized鏇翠究瀹滐紝鍥犱负瀹冧笉浼氬紩璧风嚎绋嬩笂涓嬫枃鍒囨崲鍜岃皟搴︺€傝鎴戜滑鏉ョ湅鐪嬭绠楁満銆備緥濡傦紝鎴戜滑鐨勫ぇ閮ㄥ垎宸ヤ綔閮芥槸澶氭牳鐨勩€傜敱浜嶤PU鍜岀墿鐞嗕富瀛樼殑閫熷害涓嶄竴鑷达紝涓轰簡瑙e喅CPU璇诲彇鍐呭瓨鎸囦护鍜屾暟鎹晥鐜囩殑闂锛孋PU缂撳瓨璇炵敓浜嗐€俻rivatevolatileinstance=newSingleton();鐢熸垚姹囩紪浠g爜鏃讹紝鍐欏叆volatile淇グ鐨勫叡浜彉閲忔椂浼氭湁杈冨鐨凩ock鍓嶇紑鎸囦护銆傚鏍稿鐞嗗櫒涓嬬殑Lock鍓嶇紑鎸囦护浼氬彂鐢熶袱浠朵簨銆?銆佸皢褰撳墠澶勭悊鍣ㄧ紦瀛樿鐨勬暟鎹啓鍥炵郴缁熷唴瀛?銆佽繖绉嶅啓鍥炲唴瀛樼殑鎿嶄綔锛屽湪鍏朵粬CPU涓細浣胯鍐呭瓨鍦板潃缂撳瓨鐨勬暟鎹け鏁堛€備负浜嗘彁楂樺鐞嗗櫒鐨勯€熷害锛岄鍏堝鐞嗗櫒涓嶇洿鎺ヤ笌鍐呭瓨閫氫俊锛岃€屾槸鍏堝皢绯荤粺鍐呭瓨涓殑鏁版嵁璇诲埌缂撳瓨锛圠1锛孡2锛孡3锛変腑鍐嶆墽琛屾搷浣滐紝浣嗘槸褰撴搷浣滀細鍐欏叆鍐呭瓨锛屽鏋滃啓鍏ヤ簡澹版槑涓簐olatile鐨勫彉閲忥紝JVM浼氬悜澶勭悊鍣ㄥ彂閫佷竴涓墠缂€涓篖ock鐨勫懡浠わ紝灏嗗彉閲忔墍鍦ㄧ紦瀛樿鐨勬暟鎹啓鍏ョ郴缁熷唴瀛樸€備絾鏄嵆浣垮啓鍏ュ唴瀛橈紝濡傛灉鍏朵粬澶勭悊鍣ㄤ腑瀛樺湪鐨勫€艰繕鏄棫鐨勶紝鍦ㄦ墽琛岃绠楁搷浣滄椂灏变細鍑虹幇闂銆傚洜姝わ紝鍦ㄥ澶勭悊鍣ㄤ笅锛屼负浜嗕繚璇佸悇涓鐞嗗櫒鐨勭紦瀛樻槸涓€鑷寸殑锛屼細瀹炵幇缂撳瓨涓€鑷存€у崗璁€傛瘡涓鐞嗗櫒閫氳繃鍡呮帰鎬荤嚎涓婁紶鎾殑鏁版嵁鏉ユ鏌ュ叾缂撳瓨鐨勫€兼槸鍚﹀凡杩囨湡锛屽綋澶勭悊鍣ㄥ彂鐜拌嚜宸辩殑cacheline瀵瑰簲鐨勫唴瀛樺湴鍧€涓嶅彲淇敼鏃讹紝浼氬皢褰撳墠澶勭悊鍣ㄧ殑cacheline璁剧疆涓烘棤鏁堢姸鎬併€傚綋澶勭悊鍣ㄤ慨鏀硅繖浜涙暟鎹椂锛屽畠浼氫粠绯荤粺鍐呭瓨涓噸鏂拌鍙栨暟鎹埌澶勭悊鍣ㄧ紦瀛樹腑銆傚洜姝わ紝鎴戜滑寰楀嚭浠ヤ笅缁撹锛?.Lock鍓嶇紑鐨勬寚浠や細瀵艰嚧澶勭悊鍣ㄧ紦瀛樿鍐欏洖鍐呭瓨锛涚紦瀛樿繃鏈熷悗锛屼細浠庡唴瀛樹腑閲嶆柊璇诲彇鍙橀噺鏁版嵁锛屽嵆鍙互鑾峰緱鏈€鏂扮殑褰撳墠鍊笺€傝繖鏍凤紝閫氳繃volatile鍙橀噺鐨勮繖绉嶆満鍒讹紝姣忎釜绾跨▼閮藉彲浠ヨ幏寰楄鍙橀噺鐨勬渶鏂板€硷紝鍗硋isibility銆傚彲瑙佹€ч偅涔堟垜浠潵璇佹槑volatile鏄浣曢€氳繃浠g爜淇濊瘉鍙鎬х殑锛熶繚璇佸杩欎釜鍙橀噺杩涜鎿嶄綔鏃朵笉鍚岀嚎绋嬬殑鍙鎬э紝鍗冲彉閲忎竴鏃︽敼鍙橈紝鎵€鏈夌嚎绋嬮兘鑳界珛鍗崇湅鍒?***淇濊瘉鍙鎬?/publicclassResourceData{//voliate鍏抽敭瀛楀彲浠ヤ繚璇乿ariable锛屽涓嚎绋嬩慨鏀瑰悓涓€涓彉閲忔椂锛屼竴涓嚎绋嬪畬鎴愪慨鏀癸紝鍙︿竴涓嚎绋嬭幏鍙栦慨鏀瑰悗鐨勫€笺€俻rivatevolatileintnumber=0;publicvoidadd(){this.number=10;}publicstaticvoidmain(String[]args){ResourceDataresourceData=newResourceData();newThread(()->{System.out.println(Thread.currentThread().getName()+"\tcomein");try{TimeUnit.SECONDS.sleep(3);resourceData.add();System.out.println(Thread.currentThread().getName()+"\tupdatenumbervalue"+resourceData.number);}catch(InterruptedExceptione){e.printStackTrace();}},"AA").start();//绗簩涓嚎绋嬫槸mainwhile(resourceData.number==0){}System.out.println(Thread.currentThread().getName()+"\tmissionisover,maingetnumbervalue:"+resourceData.鏁板瓧锛?}}AA杩涙潵AAupdatenumbervalue10濡傛灉鍏变韩鍙橀噺涓嶅姞volatile锛屽氨娌℃湁鍙鎬э紝绋嬪簭鍋滀笉涓嬫潵銆傛坊鍔爒olatile浠ョ‘淇濆彲瑙佹€э紝绋嬪簭鍙互鍋滄鐨勫師鐞嗚В閲婏細1.涓嶅姞volatile鍏抽敭瀛楋紝绾跨▼A鍦ㄦ洿鏀瑰叡浜彉閲忓悗灏唍umber鏀逛负10锛屼富绾跨▼锛堢嚎绋婤锛夎闂畁umber鐨勫€艰繕鏄?锛屽嵆鏃犲舰鐨勩€?銆佹坊鍔爒olatile鍚庯紝绾跨▼A鏇存敼浜嗗叡浜暟鎹紝鐒跺悗涓荤嚎绋嬪啀娆¤闂紝number鐨勫€间负鏇存敼鍚庣殑number=10銆傚師瀛愭€т笉淇濊瘉鍘熷瓙鎬с€備唬鐮佸疄鐜帮細/***涓嶄繚璇佸師瀛愭€?/publicclassResourceData2{//volatile鍏抽敭瀛椾笉鑳戒繚璇佸彉閲忕殑鍘熷瓙鎬э紝澶氫釜绾跨▼淇敼涓€涓彉閲忔椂鍙兘浼氬嚭鐜板啓涓㈠け銆?/濡備綍淇濊瘉鏁版嵁鐨勫師瀛愭€rivatevolatileintnumber=0;//AtomicInteger鍖呰绫诲彲浠ヤ繚璇佸彉閲忕殑鍘熷瓙鎬tomicIntegeratomicInteger=newAtomicInteger();publicvoidaddAtomic(){atomicInteger.getAndIncrement();}publicvoidadd(){number++;}publicstaticvoidmain(String[]args){ResourceData2resourceData=newResourceData2();for(inti=0;i<20;i++){newThread(()->{for(intj=0;j<1000;j++){resourceData.add();resourceData.addAtomic();}},String.valueOf(i)).start();}//绛夊緟浠ヤ笂鎵€鏈夌嚎绋嬭绠楀畬鎴愶紝鐒跺悗閫氳繃涓荤嚎绋嬭幏鍙栨渶缁堢粨鏋渨hile(Thread.activeCount()>2){//鎸噈ain鍜孏cThread.yield();}System.out.println(Thread.currentThread().getName()+"\tfinallynumbervalue:"+resourceData.number+"\tfinallyatomicIntegervalue:"+resourceData.atomicInteger);}}棰勬湡缁撴灉鏄細20000锛屼絾瀹為檯缁撴灉鏄細19778锛岄偅涔堟槸浠€涔堝師鍥犻€犳垚鐨勫憿锛熼鍏堬紝涓€璇讳竴鍐欎笉浼氭湁鏁版嵁闂锛屽洜涓哄亣璁緈aster鍐呭瓨鍏变韩鍙橀噺number=1闇€瑕佸鐞嗕富鍐呭瓨鐨刵umber++锛屽鏋淭1鍜孴2涓や釜绾跨▼杩涜涓€娆¤涓€娆″啓鎿嶄綔锛屼笉浼氭湁鏁版嵁涓㈠け锛屽湪鏌愪釜鏃跺埢锛宼1鎶㈠埌CPU鐨勬墽琛屾潈锛屽皢鍏变韩鏁版嵁璇诲洖T1鐨勫伐浣滃唴瀛橈紝杩涜number++鎿嶄綔锛屾鏃秐umber=2锛屼粠宸ヤ綔鍐呭瓨鍐欏洖涓诲瓨锛岀珛鍗抽€氱煡T2绾跨▼鎶妌umber=2璇诲叆T2Work绾跨▼锛屾墍浠ヤ笉浼氶€犳垚鏁版嵁涓㈠け鐨勯棶棰橈紝瀵逛簬涓ゆ鍐欙紝浼氭湁鏁版嵁闂锛屽亣璁句富瀛樼殑鍏变韩鍙橀噺number=0锛岄渶瑕佹墽琛宯umber++鍦ㄤ富瀛樹笂澶勭悊10娆★紝鏈€鍚庣殑缁撴灉鏄?0銆傚浜庝袱涓嚎绋婽1鍜孴2濡傛灉杩涜涓ゆ鍐欐搷浣滐紝鏁版嵁浼氫涪澶便€俆1鍜孴2灏嗕富瀛樼殑鍏变韩鏁版嵁璇诲彇鍒板悇鑷殑宸ヤ綔鍐呭瓨涓€傚湪鏌愪釜鏃跺埢锛孴1绾跨▼鎶㈣蛋浜咰PU鐨勬墽琛屾潈銆傝繘琛宯umber++澶勭悊锛屽皢宸ヤ綔鍐呭瓨涓殑number=1鍐欏洖涓诲唴瀛樸€傛鏃禩2涔熸姠鍒颁簡CPU鎵ц鏉冿紝杩涜number++澶勭悊銆傛鏃秐umber++鍚庣殑缁撴灉涔熺瓑浜?锛孴1灏哊umber=1鍐欏洖涓诲瓨锛岄€氱煡T2绾跨▼灏嗕富瀛樹腑鐨刵umber=1璇诲叆T2鐨勫伐浣滃唴瀛?杩欐椂鍊欏浜嶵2鏉ヨ锛屽畠杩樿繘琛屼簡涓€娆umber++杩愮畻锛屾墠浼氬け鏁堬紝鍐嶆鍥炲埌number++鎿嶄綔銆傝繖鏍蜂篃鏄啓浜嗕竴娆℃暟鎹氨涓簡锛屾墍浠umber++10娆″悗鐨勭粨鏋滀笉浼氱瓑浜?0銆傜姝㈡寚浠ら噸鎺扲eordering鏄寚缂栬瘧鍣ㄥ拰澶勭悊鍣ㄤ负浜嗕紭鍖栫▼搴忔€ц兘锛屽鎸囦护搴忓垪杩涜閲嶆柊鎺掑簭鐨勪竴绉嶆墜娈碉紝鏈夋椂浼氭敼鍙樼▼搴忚鍙ョ殑椤哄簭锛堟病鏈夋暟鎹緷璧栵紝鍙互閲嶆柊鎺掑簭锛涙湁鏁版嵁渚濊禆锛岀姝㈤噸鏂版帓搴?reordering鐨勫垎绫诲拰鎵ц娴佺▼1.Compileroptimizedreordering锛氱紪璇戝櫒鍙互鍦ㄤ笉鏀瑰彉鍗曠嚎绋嬩覆琛岃涔夌殑鎯呭喌涓嬮噸鏂拌皟鏁存寚浠ょ殑鎵ц椤哄簭2.Instruction-levelparallelismReorderingofreordering锛氬鐞嗗櫒浣跨敤鎸囦护绾у苟琛屾妧鏈噸鍙犲苟鎵ц澶氭潯鎸囦护銆傚鏋滄病鏈夋暟鎹緷璧栵紝澶勭悊鍣ㄥ彲浠ユ敼鍙樿鍙ュ搴旂殑鏈哄櫒鎸囦护鐨勬墽琛岄『搴忋€?.鍐呭瓨绯荤粺鐨勯噸鏂版帓搴忥細鐢变簬澶勭悊鍣ㄤ娇鐢ㄧ紦瀛樺拰璇?鍐欑紦鍐插尯锛岃繖浣垮緱鍔犺浇鍜屽瓨鍌ㄦ搷浣滅湅璧锋潵鏄棤搴忕殑鏁版嵁渚濊禆锛氬鏋滀袱涓搷浣滆闂悓涓€涓彉閲忥紝骞朵笖涓や釜鎿嶄綔涔嬩竴operations鏄啓鎿嶄綔锛屽垯璇ュ瓨鍦ㄦ暟鎹緷璧栵紙瀛樺湪鏁版嵁渚濊禆锛岀姝㈤噸鎺掑簭锛屽洜涓轰細瀵艰嚧绋嬪簭杩愯缁撴灉涓嶅悓锛夛紝濡傛灉涓嶅瓨鍦ㄤ緷璧栵紝鍒欏彲浠ラ噸鎺掑簭銆傛枃绔犻摼鎺ワ細娣卞叆鐞嗚Вvolatile馃憠濡傛灉鏈枃瀵逛綘鏈夊府鍔╋紝璇风偣涓禐锝滃叧娉紝闈炲父鎰熻阿
