锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 閿佺珵浜?/font> 褰卞搷閿佺珵浜夋х殑鏉′歡鏈変袱涓細閿佽璇鋒眰鐨勯鐜囧拰姣忔鎸佹湁閿佺殑鏃墮棿銆傛樉鐒跺綋鑰岃繖浜岃呴兘寰堝皬鐨勬椂鍊欙紝閿佺珵浜変笉浼氭垚涓轟富瑕佺殑鐡墮銆備絾鏄鏋滈攣浣跨敤涓嶅綋錛屽鑷翠簩鑰呴兘姣旇緝澶э紝閭d箞寰堟湁鍙兘CPU涓嶈兘鏈夋晥鐨勫鐞嗕換鍔★紝浠誨姟琚ぇ閲忓爢縐?/p>
鎵浠ュ噺灝戦攣绔炰簤鐨勬柟寮忔湁涓嬮潰涓夌錛?/p>
姝婚攣 1.涓縐嶆儏鍐墊槸綰跨▼A姘歌繙涓嶉噴鏀鵑攣錛岀粨鏋淏涓鐩存嬁涓嶅埌閿侊紝鎵浠ョ嚎紼婤灝?#8220;姝繪帀”浜?br />
2.絎簩縐嶆儏鍐典笅錛岀嚎紼婣鎷ユ湁綰跨▼B闇瑕佺殑閿乊錛屽悓鏃剁嚎紼婤鎷ユ湁綰跨▼A闇瑕佺殑閿乆錛岄偅涔堣繖鏃跺欑嚎紼婣/B浜掔浉渚濊禆瀵規柟閲婃斁閿侊紝浜庢槸浜岃呴兘“姝繪帀”浜嗐?br />
3.濡傛灉涓涓嚎紼嬫繪槸涓嶈兘琚皟搴︼紝閭d箞絳夊緟姝ょ嚎紼嬬粨鏋滅殑綰跨▼鍙兘灝辨閿佷簡銆傝繖縐嶆儏鍐靛彨鍋氱嚎紼嬮ゥ楗挎閿併傛瘮濡傝闈炲叕騫抽攣涓紝濡傛灉鏌愪簺綰跨▼闈炲父媧昏穬錛屽湪楂樺茍鍙戞儏鍐典笅榪欑被綰跨▼鍙兘鎬繪槸鎷垮埌閿侊紝閭d箞閭d簺媧昏穬搴︿綆鐨勭嚎紼嬪彲鑳藉氨涓鐩存嬁涓嶅埌閿侊紝榪欐牱灝卞彂鐢熶簡“楗ラタ姝?#8221;銆?/p>
閬垮厤姝婚攣鐨勮В鍐蟲柟妗堟槸錛?br />
1.灝藉彲鑳界殑鎸夌収閿佺殑浣跨敤瑙勮寖璇鋒眰閿侊紝鍙﹀閿佺殑璇鋒眰綺掑害瑕佸皬錛堜笉瑕佸湪涓嶉渶瑕侀攣鐨勫湴鏂瑰崰鐢ㄩ攣錛岄攣涓嶇敤浜嗗敖蹇噴鏀撅級錛?br />
2.鍦ㄩ珮綰ч攣閲岄潰鎬繪槸浣跨敤tryLock鎴栬呭畾鏃舵満鍒訛紙灝辨槸鎸囧畾鑾峰彇閿佽秴鏃剁殑鏃墮棿錛屽鏋滄椂闂村埌浜嗚繕娌℃湁鑾峰彇鍒伴攣閭d箞灝辨斁寮冿級銆傞珮綰ч攣錛圠ock錛夐噷闈㈢殑榪欎袱縐嶆柟寮忓彲浠ユ湁鏁堢殑閬垮厤姝婚攣銆?/p>
鍦↗DK 5涔嬪墠Java璇█鏄潬synchronized鍏抽敭瀛椾繚璇佸悓姝ョ殑錛岃繖浼氬鑷存湁閿侊紙鍚庨潰鐨勭珷鑺傝繕浼氳皥鍒伴攣錛夈?/p>
閿佹満鍒跺瓨鍦ㄤ互涓嬮棶棰橈細 錛?錛夊湪澶氱嚎紼嬬珵浜変笅錛屽姞閿併侀噴鏀鵑攣浼氬鑷存瘮杈冨鐨勪笂涓嬫枃鍒囨崲鍜岃皟搴﹀歡鏃訛紝寮曡搗鎬ц兘闂銆?/p>
錛?錛変竴涓嚎紼嬫寔鏈夐攣浼氬鑷村叾瀹冩墍鏈夐渶瑕佹閿佺殑綰跨▼鎸傝搗銆?/p>
錛?錛夊鏋滀竴涓紭鍏堢駭楂樼殑綰跨▼絳夊緟涓涓紭鍏堢駭浣庣殑綰跨▼閲婃斁閿佷細瀵艱嚧浼樺厛綰у掔疆錛屽紩璧鋒ц兘椋庨櫓銆?/p>
volatile鏄笉閿欑殑鏈哄埗錛屼絾鏄痸olatile涓嶈兘淇濊瘉鍘熷瓙鎬с傚洜姝ゅ浜庡悓姝ユ渶緇堣繕鏄鍥炲埌閿佹満鍒朵笂鏉ャ?/p>
鐙崰閿佹槸涓縐嶆偛瑙傞攣錛宻ynchronized灝辨槸涓縐嶇嫭鍗犻攣錛屼細瀵艱嚧鍏跺畠鎵鏈夐渶瑕侀攣鐨勭嚎紼嬫寕璧鳳紝絳夊緟鎸佹湁閿佺殑綰跨▼閲婃斁閿併傝屽彟涓涓洿鍔犳湁鏁堢殑閿佸氨鏄箰瑙傞攣銆傛墍璋?span style="color: red">涔?span style="color: red">瑙傞攣灝辨槸錛?/span>
]]>
]]>
CAS 鎿嶄綔
涓婇潰鐨勪箰瑙傞攣鐢ㄥ埌鐨勬満鍒跺氨鏄疌AS錛孋ompare and Swap銆?/p>
CAS鏈?涓搷浣滄暟錛屽唴瀛樺糣錛屾棫鐨勯鏈熷糀錛岃淇敼鐨勬柊鍊糂銆傚綋涓斾粎褰撻鏈熷糀鍜屽唴瀛樺糣鐩稿悓鏃訛紝灝嗗唴瀛樺糣淇敼涓築錛屽惁鍒欎粈涔堥兘涓嶅仛銆?/p>
闈為樆濉炵畻娉?錛坣onblocking algorithms錛?/strong>
涓涓嚎紼嬬殑澶辮觸鎴栬呮寕璧蜂笉搴旇褰卞搷鍏朵粬綰跨▼鐨勫け璐ユ垨鎸傝搗鐨勭畻娉曘?/p>
鐜頒唬鐨凜PU鎻愪緵浜嗙壒孌婄殑鎸囦護錛屽彲浠ヨ嚜鍔ㄦ洿鏂板叡浜暟鎹紝鑰屼笖鑳藉媯嫻嬪埌鍏朵粬綰跨▼鐨勫共鎵幫紝鑰?compareAndSet() 灝辯敤榪欎簺浠f浛浜嗛攣瀹氥?/p>
鎷垮嚭AtomicInteger鏉ョ爺絀跺湪娌℃湁閿佺殑鎯呭喌涓嬫槸濡備綍鍋氬埌鏁版嵁姝g‘鎬х殑銆?/p>
private volatile int value;
棣栧厛姣棤浠ヤ負錛?span style="color: red">鍦ㄦ病鏈夐攣鐨勬満鍒朵笅鍙兘闇瑕佸熷姪volatile鍘熻錛屼繚璇佺嚎紼嬮棿鐨勬暟鎹槸鍙鐨勶紙鍏變韓鐨勶級銆?/span>榪欐牱鎵嶈幏鍙栧彉閲忕殑鍊肩殑鏃跺欐墠鑳界洿鎺ヨ鍙栥?/p>
public final int get() {
return value;
}
鐒跺悗鏉ョ湅鐪?+i鏄庝箞鍋氬埌鐨勩?/p>
public final int incrementAndGet() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return next;
}
}
鍦ㄨ繖閲岄噰鐢ㄤ簡CAS鎿嶄綔錛屾瘡嬈′粠鍐呭瓨涓鍙栨暟鎹劧鍚庡皢姝ゆ暟鎹拰+1鍚庣殑緇撴灉榪涜CAS鎿嶄綔錛屽鏋滄垚鍔熷氨榪斿洖緇撴灉錛屽惁鍒欓噸璇曠洿鍒版垚鍔熶負姝€?/p>
鑰宑ompareAndSet鍒╃敤JNI鏉ュ畬鎴怌PU鎸囦護鐨勬搷浣溿?/p>
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
鏁翠綋鐨勮繃紼嬪氨鏄繖鏍峰瓙鐨勶紝鍒╃敤CPU鐨凜AS鎸囦護錛屽悓鏃跺熷姪JNI鏉ュ畬鎴怞ava鐨勯潪闃誨綆楁硶銆傚叾瀹冨師瀛愭搷浣滈兘鏄埄鐢ㄧ被浼肩殑鐗規у畬鎴愮殑銆?/p>
鑰屾暣涓狫.U.C閮芥槸寤虹珛鍦–AS涔嬩笂鐨勶紝鍥犳瀵逛簬synchronized闃誨綆楁硶錛孞.U.C鍦ㄦц兘涓婃湁浜嗗緢澶х殑鎻愬崌銆?br />
CAS鐪嬭搗鏉ュ緢鐖斤紝浣嗘槸浼氬鑷?#8220;ABA闂”銆?/p>
CAS綆楁硶瀹炵幇涓涓噸瑕佸墠鎻愰渶瑕佸彇鍑哄唴瀛樹腑鏌愭椂鍒葷殑鏁版嵁錛岃屽湪涓嬫椂鍒繪瘮杈冨茍鏇挎崲錛岄偅涔堝湪榪欎釜鏃墮棿宸被浼氬鑷存暟鎹殑鍙樺寲銆?/p>
姣斿璇翠竴涓嚎紼媜ne浠庡唴瀛樹綅緗甐涓彇鍑篈錛岃繖鏃跺欏彟涓涓嚎紼媡wo涔熶粠鍐呭瓨涓彇鍑篈錛屽茍涓攖wo榪涜浜嗕竴浜涙搷浣滃彉鎴愪簡B錛岀劧鍚巘wo鍙堝皢V浣嶇疆鐨勬暟鎹彉鎴怉錛岃繖鏃跺欑嚎紼媜ne榪涜CAS鎿嶄綔鍙戠幇鍐呭瓨涓粛鐒舵槸A錛岀劧鍚巓ne鎿嶄綔鎴愬姛銆傚敖綆$嚎紼媜ne鐨凜AS鎿嶄綔鎴愬姛錛屼絾鏄笉浠h〃榪欎釜榪囩▼灝辨槸娌℃湁闂鐨勩傚鏋滈摼琛ㄧ殑澶村湪鍙樺寲浜嗕袱嬈″悗鎭㈠浜嗗師鍊鹼紝浣嗘槸涓嶄唬琛ㄩ摼琛ㄥ氨娌℃湁鍙樺寲銆傚洜姝ゅ墠闈㈡彁鍒扮殑鍘熷瓙鎿嶄綔AtomicStampedReference/AtomicMarkableReference灝卞緢鏈夌敤浜嗐傝繖鍏佽涓瀵瑰彉鍖栫殑鍏冪礌榪涜鍘熷瓙鎿嶄綔銆?/span>
volatile淇濊瘉綰跨▼闂寸殑鏁版嵁鏄彲瑙佺殑錛堝叡浜殑錛夛紝浣嗕笉淇濊瘉鏁版嵁鍚屾
volatile鐩稿綋浜巗ynchronized鐨勫急瀹炵幇錛屼篃灝辨槸璇磛olatile瀹炵幇浜嗙被浼約ynchronized鐨勮涔夛紝鍗村張娌℃湁閿佹満鍒躲傚畠紜繚瀵箆olatile瀛楁鐨勬洿鏂頒互鍙瑙佺殑鏂瑰紡鍛婄煡鍏朵粬鐨勭嚎紼嬨?br />
volatile鍖呭惈浠ヤ笅璇箟錛?br />
錛?錛塉ava 瀛樺偍妯″瀷涓嶄細瀵箆alatile鎸囦護鐨勬搷浣滆繘琛岄噸鎺掑簭錛氳繖涓繚璇佸volatile鍙橀噺鐨勬搷浣滄椂鎸夌収鎸囦護鐨勫嚭鐜伴『搴忔墽琛岀殑銆?br />
錛?錛塿olatile鍙橀噺涓嶄細琚紦瀛樺湪瀵勫瓨鍣ㄤ腑錛堝彧鏈夋嫢鏈夌嚎紼嬪彲瑙侊級鎴栬呭叾浠栧CPU涓嶅彲瑙佺殑鍦版柟錛屾瘡嬈℃繪槸浠庝富瀛樹腑璇誨彇volatile鍙橀噺鐨勭粨鏋溿備篃灝辨槸璇村浜巚olatile鍙橀噺鐨勪慨鏀癸紝鍏跺畠綰跨▼鎬繪槸鍙鐨勶紝騫朵笖涓嶆槸浣跨敤鑷繁綰跨▼鏍堝唴閮ㄧ殑鍙橀噺銆備篃灝辨槸鍦╤appens-before娉曞垯涓紝瀵逛竴涓獀alatile鍙橀噺鐨勫啓鎿嶄綔鍚庯紝鍏跺悗鐨勪換浣曡鎿嶄綔鐞嗚В鍙姝ゅ啓鎿嶄綔鐨勭粨鏋溿?br />
volatile鍙橀噺鐨勭壒鎬т笉閿欙紝浣嗘槸volatile騫朵笉鑳戒繚璇佺嚎紼嬪畨鍏ㄧ殑錛屼篃灝辨槸璇磛olatile瀛楁鐨勬搷浣滀笉鏄師瀛愭х殑錛寁olatile鍙橀噺鍙兘淇濊瘉鍙鎬э紙涓涓嚎紼嬩慨鏀瑰悗鍏跺畠綰跨▼鑳藉鐞嗚В鐪嬪埌姝ゅ彉鍖栧悗鐨勭粨鏋滐級錛岃鎯充繚璇佸師瀛愭э紝鐩墠涓烘鍙兘鍔犻攣錛?br />
volatile閫氬父鍦ㄤ笅闈㈢殑鍦烘櫙錛?/p>
搴旂敤volatile鍙橀噺鐨勪笁涓師鍒欙細
錛?錛夊啓鍏ュ彉閲忎笉渚濊禆姝ゅ彉閲忕殑鍊鹼紝鎴栬呭彧鏈変竴涓嚎紼嬩慨鏀規鍙橀噺
錛?錛夊彉閲忕殑鐘舵佷笉闇瑕佷笌鍏跺畠鍙橀噺鍏卞悓鍙備笌涓嶅彉綰︽潫
錛?錛夎闂彉閲忎笉闇瑕佸姞閿?/p>