锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 涓轟簡浼樺寲Java鐨凩ock鏈哄埗錛屼粠Java6寮濮嬪紩鍏ヤ簡杞婚噺綰ч攣鐨勬蹇點?/p>
杞婚噺綰ч攣錛圠ightweight Locking錛夋湰鎰忔槸涓轟簡鍑忓皯澶氱嚎紼嬭繘鍏ヤ簰鏂ョ殑鍑犵巼錛屽茍涓嶆槸瑕佹浛浠d簰鏂ャ?br />
瀹冨埄鐢ㄤ簡CPU鍘熻Compare-And-Swap(CAS錛屾眹緙栨寚浠MPXCHG)錛屽皾璇曞湪榪涘叆浜掓枼鍓嶏紝榪涜琛ユ晳銆?/p>
鏈枃灝嗚緇嗕粙緇岼VM濡備綍鍒╃敤CAS錛屽疄鐜拌交閲忕駭閿併?/p>
Java Object Model涓畾涔夛紝Object Header鏄竴涓?瀛楋紙1 word = 4 byte錛夐暱搴︾殑瀛樺偍鍖哄煙銆?br />
絎竴涓瓧闀垮害鐨勫尯鍩熺敤鏉ユ爣璁板悓姝ワ紝GC浠ュ強hash code絳夛紝瀹樻柟縐頒箣涓?mark word銆傜浜屼釜瀛楅暱搴︾殑鍖哄煙鏄寚鍚戝埌瀵硅薄鐨凜lass銆?/p>
鍦?涓獁ord涓紝mark word鏄交閲忕駭閿佸疄鐜扮殑鍏抽敭銆傚畠鐨勭粨鏋勮涓嬭〃 浠庤〃涓彲浠ョ湅鍒幫紝state涓簂ightweight locked鐨勯偅琛屽嵆涓鴻交閲忕駭閿佹爣璁般俠itfieds鍚嶄負鎸囧悜lock record鐨勬寚閽堬紝榪欓噷鐨?strong>lock record錛屽叾瀹炴槸涓鍧楀垎閰嶅湪綰跨▼鍫嗘爤涓婄殑絀洪棿鍖哄煙銆?br />
鐢ㄤ簬CAS鍓嶏紝鎷瘋礉object涓婄殑mark word(涓轟粈涔堣鎷瘋礉錛岃鐪嬩笅鏂?銆?br />
絎笁欏規槸閲嶉噺綰ч攣鏍囪銆傚悗闈㈢殑鐘舵佸崟璇嶅緢鏈夎叮錛宨nflated錛岃瘧涓鴻啫鑳錛屽湪榪欓噷鎰忔濆叾瀹炴槸閿佸凡鍗囩駭鍒癘S-level銆?br />
鍦ㄦ湰鏂囩殑鑼冨洿鍐咃紝鎴戜滑鍙叧娉ㄧ浜屽拰絎笁欏瑰嵆鍙?/p>
涓轟簡鑳界洿瑙傜殑鐞嗚Вlock錛寀nlock涓巑ark word涔嬮棿鐨勮仈緋伙紝鎴戠敾浜嗕竴寮犳祦紼嬪浘錛?/p>
鍦ㄥ浘涓紝鎻愬埌浜嗘嫹璐漮bject mark word錛岀敱浜庤劚紱諱簡鍘熷mark word錛屽畼鏂瑰皢瀹冨啝浠isplaced鍓嶇紑錛屽嵆displaced mark word(緗崲鏍囪瀛?銆?br />
榪欎釜displaced mark word鏄暣涓交閲忕駭閿佸疄鐜扮殑鍏抽敭錛屽湪CAS涓殑compare灝遍渶瑕佺敤瀹冧綔涓烘潯浠躲?/p>
涓轟粈涔堣鎷瘋礉mark word錛?br />
鍏跺疄寰堢畝鍗曪紝鍘熷洜鏄負浜嗕笉鎯沖湪lock涓巙nlock榪欑搴曞眰鎿嶄綔涓婂啀鍔犲悓姝ャ?/p>
鍦ㄦ嫹璐濆畬object mark word涔嬪悗錛孞VM鍋氫簡涓姝?strong>浜ゆ崲鎸囬拡鐨勬搷浣?/strong>錛屽嵆嫻佺▼涓涓涓鑹茬煩褰㈡鍐呭鎵榪般?br />
灝唎bject mark word閲岀殑杞婚噺綰ч攣鎸囬拡鎸囧悜lock record鎵鍦ㄧ殑stack鎸囬拡錛屼綔鐢ㄦ槸璁╁叾浠栫嚎紼嬬煡閬擄紝璇bject monitor宸茶鍗犵敤銆?br />
lock record閲岀殑owner鎸囬拡鎸囧悜object mark word鐨勪綔鐢ㄦ槸涓轟簡鍦ㄦ帴涓嬮噷鐨勮繍琛岃繃紼嬩腑錛岃瘑鍒摢涓璞¤閿佷綇浜嗐?/p>
涓嬪浘鐩磋鍦版弿榪頒簡浜ゆ崲鎸囬拡鐨勬搷浣溿?/p>
鏈鍚庝竴姝nlock涓紝鎴戜滑鍙戠幇錛孞VM鍚屾牱浣跨敤浜咰AS鏉ラ獙璇乷bject mark word鍦ㄦ寔鏈夐攣鍒伴噴鏀鵑攣涔嬮棿錛屾湁鏃犺鍏朵粬綰跨▼璁塊棶銆?br />
濡傛灉鍏朵粬綰跨▼鍦ㄦ寔鏈夐攣榪欐鏃墮棿閲岋紝灝濊瘯鑾峰彇榪囬攣錛屽垯鍙兘鑷韓琚寕璧鳳紝鑰宮ark word鐨勯噸閲忕駭閿佹寚閽堜篃浼氳鐩稿簲淇敼銆?br />
姝ゆ椂錛寀nlock鍚庡氨闇瑕佸敜閱掕鎸傝搗鐨勭嚎紼嬨?/p>
鍘熸枃閾炬帴錛?a rel="bookmark">http://kenwublog.com/theory-of-lightweight-locking-upon-cas鍘熺悊璇﹁В
]]>
鍐呭瓨妯″瀷鎻忚堪鐨勬槸紼嬪簭涓悇鍙橀噺錛堝疄渚嬪煙銆侀潤鎬佸煙鍜屾暟緇勫厓绱狅級涔嬮棿鐨勫叧緋伙紝浠ュ強鍦ㄥ疄闄呰綆楁満緋葷粺涓皢鍙橀噺瀛樺偍鍒板唴瀛樺拰浠庡唴瀛樺彇鍑哄彉閲忚繖鏍風殑浣庡眰緇嗚妭.
涓嶅悓騫沖彴闂寸殑澶勭悊鍣ㄦ灦鏋勫皢鐩存帴褰卞搷鍐呭瓨妯″瀷鐨勭粨鏋?
鍦–鎴朇++涓? 鍙互鍒╃敤涓嶅悓鎿嶄綔騫沖彴涓嬬殑鍐呭瓨妯″瀷鏉ョ紪鍐欏茍鍙戠▼搴? 浣嗘槸, 榪欏甫緇欏紑鍙戜漢鍛樼殑鏄? 鏇撮珮鐨勫涔犳垚鏈?
鐩告瘮涔嬩笅, java鍒╃敤浜嗚嚜韜櫄鎷熸満鐨勪紭鍔? 浣垮唴瀛樻ā鍨嬩笉鏉熺細浜庡叿浣撶殑澶勭悊鍣ㄦ灦鏋? 鐪熸瀹炵幇浜嗚法騫沖彴.
(閽堝hotspot jvm, jrockit絳変笉鍚岀殑jvm, 鍐呭瓨妯″瀷涔熶細涓嶇浉鍚?
鍐呭瓨妯″瀷鐨勭壒寰?
a, Visibility 鍙鎬?(澶氭牳,澶氱嚎紼嬮棿鏁版嵁鐨勫叡浜?
b, Ordering 鏈夊簭鎬?(瀵瑰唴瀛樿繘琛岀殑鎿嶄綔搴旇鏄湁搴忕殑)
java 鍐呭瓨妯″瀷 ( java memory model )
鏍規嵁Java Language Specification涓殑璇存槑, jvm緋葷粺涓瓨鍦ㄤ竴涓富鍐呭瓨(Main Memory鎴朖ava Heap Memory)錛孞ava涓墍鏈夊彉閲忛兘鍌ㄥ瓨鍦ㄤ富瀛樹腑錛屽浜庢墍鏈夌嚎紼嬮兘鏄叡浜殑銆?/p>
姣忔潯綰跨▼閮芥湁鑷繁鐨勫伐浣滃唴瀛?Working Memory)錛屽伐浣滃唴瀛樹腑淇濆瓨鐨勬槸涓誨瓨涓煇浜涘彉閲忕殑鎷瘋礉錛岀嚎紼嬪鎵鏈夊彉閲忕殑鎿嶄綔閮芥槸鍦ㄥ伐浣滃唴瀛樹腑榪涜錛岀嚎紼嬩箣闂存棤娉曠浉浜掔洿鎺ヨ闂紝鍙橀噺浼犻掑潎闇瑕侀氳繃涓誨瓨瀹屾垚銆?br />
鍏朵腑, 宸ヤ綔鍐呭瓨閲岀殑鍙橀噺, 鍦ㄥ鏍稿鐞嗗櫒涓? 灝嗗ぇ閮ㄥ垎鍌ㄥ瓨浜庡鐞嗗櫒楂橀熺紦瀛樹腑, 楂橀熺紦瀛樺湪涓嶇粡榪囧唴瀛樻椂, 涔熸槸涓嶅彲瑙佺殑.
jmm鎬庝箞浣撶幇 鍙鎬?Visibility) ?
鍦╦mm涓? 閫氳繃騫跺彂綰跨▼淇敼鍙橀噺鍊? 蹇呴』灝嗙嚎紼嬪彉閲忓悓姝ュ洖涓誨瓨鍚? 鍏朵粬綰跨▼鎵嶈兘璁塊棶鍒?
jmm鎬庝箞浣撶幇 鏈夊簭鎬?Ordering) ?
閫氳繃java鎻愪緵鐨勫悓姝ユ満鍒舵垨volatile鍏抽敭瀛? 鏉ヤ繚璇佸唴瀛樼殑璁塊棶欏哄簭.
緙撳瓨涓鑷存э紙cache coherency錛?
浠涔堟槸緙撳瓨涓鑷存?
瀹冩槸涓縐嶇鐞嗗澶勭悊鍣ㄧ郴緇熺殑楂橀熺紦瀛樺尯緇撴瀯錛屽叾鍙互淇濊瘉鏁版嵁鍦ㄩ珮閫熺紦瀛樺尯鍒板唴瀛樼殑浼犺緭涓笉浼氫涪澶辨垨閲嶅銆?鏉ヨ嚜wikipedia)
涓句緥鐞嗚В:
鍋囧鏈変竴涓鐞嗗櫒鏈変竴涓洿鏂頒簡鐨勫彉閲忓間綅浜庡叾緙撳瓨涓紝浣嗚繕娌℃湁琚啓鍏ヤ富鍐呭瓨錛岃繖鏍峰埆鐨勫鐞嗗櫒灝卞彲鑳戒細鐪嬩笉鍒拌繖涓洿鏂扮殑鍊?
瑙e喅緙撳瓨涓鑷存х殑鏂規硶?
a, 欏哄簭涓鑷存фā鍨?
瑕佹眰鏌愬鐞嗗櫒瀵規墍鏀瑰彉鐨勫彉閲忓肩珛鍗寵繘琛屼紶鎾? 騫剁‘淇濊鍊艱鎵鏈夊鐞嗗櫒鎺ュ彈鍚? 鎵嶈兘緇х畫鎵ц鍏朵粬鎸囦護.
b, 閲婃斁涓鑷存фā鍨? (綾諱技jmm cache coherency)
鍏佽澶勭悊鍣ㄥ皢鏀瑰彉鐨勫彉閲忓煎歡榪熷埌閲婃斁閿佹椂鎵嶈繘琛屼紶鎾?
jmm緙撳瓨涓鑷存фā鍨?– “happens-before ordering(鍏堣鍙戠敓鎺掑簭)”
涓鑸儏鍐典笅鐨勭ず渚嬬▼搴?
x = 0;
y = 0;
i = 0;
j = 0;
// thread A
y = 1;
x = 1;
// thread B
i = x;
j = y;
鍦ㄥ涓婄▼搴忎腑, 濡傛灉綰跨▼A,B鍦ㄦ棤淇濋殰鎯呭喌涓嬭繍琛? 閭d箞i,j鍚勪細鏄粈涔堝煎憿?
絳旀鏄? 涓嶇‘瀹? (00,01,10,11閮芥湁鍙兘鍑虹幇)
榪欓噷娌℃湁浣跨敤java鍚屾鏈哄埗, 鎵浠?jmm 鏈夊簭鎬у拰鍙鎬?閮芥棤娉曞緱鍒頒繚闅?
happens-before ordering( 鍏堣鍙戠敓鎺掑簭) 濡備綍閬垮厤榪欑鎯呭喌?
鎺掑簭鍘熷垯宸茬粡鍋氬埌:
a, 鍦ㄧ▼搴忛『搴忎腑, 綰跨▼涓殑姣忎竴涓搷浣? 鍙戠敓鍦ㄥ綋鍓嶆搷浣滃悗闈㈠皢瑕佸嚭鐜扮殑姣忎竴涓搷浣滀箣鍓?
b, 瀵硅薄鐩戣鍣ㄧ殑瑙i攣鍙戠敓鍦ㄧ瓑寰呰幏鍙栧璞¢攣鐨勭嚎紼嬩箣鍓?
c, 瀵箆olitile鍏抽敭瀛椾慨楗扮殑鍙橀噺鍐欏叆鎿嶄綔, 鍙戠敓鍦ㄥ璇ュ彉閲忕殑璇誨彇涔嬪墠.
d, 瀵逛竴涓嚎紼嬬殑 Thread.start() 璋冪敤 鍙戠敓鍦ㄥ惎鍔ㄧ殑綰跨▼涓殑鎵鏈夋搷浣滀箣鍓?
e, 綰跨▼涓殑鎵鏈夋搷浣?鍙戠敓鍦ㄤ粠榪欎釜綰跨▼鐨?Thread.join()鎴愬姛榪斿洖鐨勬墍鏈夊叾浠栫嚎紼嬩箣鍓?
涓轟簡瀹炵幇 happends-before ordering鍘熷垯, java鍙妀dk鎻愪緵鐨勫伐鍏?
a, synchronized鍏抽敭瀛?br />
b, volatile鍏抽敭瀛?br />
c, final鍙橀噺
d, java.util.concurrent.locks鍖?since jdk 1.5)
e, java.util.concurrent.atmoic鍖?since jdk 1.5)
…
浣跨敤浜唄appens-before ordering鐨勪緥瀛?
(1) 鑾峰彇瀵硅薄鐩戣鍣ㄧ殑閿?lock)
(2) 娓呯┖宸ヤ綔鍐呭瓨鏁版嵁, 浠庝富瀛樺鍒跺彉閲忓埌褰撳墠宸ヤ綔鍐呭瓨, 鍗沖悓姝ユ暟鎹?(read and load)
(3) 鎵ц浠g爜錛屾敼鍙樺叡浜彉閲忓?(use and assign)
(4) 灝嗗伐浣滃唴瀛樻暟鎹埛鍥炰富瀛?(store and write)
(5) 閲婃斁瀵硅薄鐩戣鍣ㄧ殑閿?(unlock)
娉ㄦ剰: 鍏朵腑4,5涓ゆ鏄悓鏃惰繘琛岀殑.
榪欒竟鏈鏍稿績鐨勫氨鏄浜屾, 浠栧悓姝ヤ簡涓誨唴瀛?鍗沖墠涓涓嚎紼嬪鍙橀噺鏀瑰姩鐨勭粨鏋?鍙互琚綋鍓嶇嚎紼嬭幏鐭?(鍒╃敤浜唄appens-before ordering鍘熷垯)
瀵規瘮涔嬪墠鐨勪緥瀛?/strong> 緇忓吀j2ee璁捐妯″紡Double-Checked Locking澶辨晥闂 瑕佸睍紺篋CL澶辨晥闂, 棣栧厛瑕佺悊瑙d竴涓噸瑕佹蹇? 寤惰繜鍔犺澆(lazy loading). 闈炲崟渚嬬殑鍗曠嚎紼嬪歡榪熷姞杞界ず渚? 闈炲崟渚嬬殑 澶氱嚎紼嬪歡榪熷姞杞界ず渚? 闈炲崟渚嬬殑 DCL澶氱嚎紼嬪歡榪熷姞杞界ず渚? Double-Checked Locking鐪嬭搗鏉ユ槸闈炲父瀹岀編鐨勩備絾鏄緢閬楁喚錛屾牴鎹甁ava鐨勮璦瑙勮寖錛屼笂闈㈢殑浠g爜鏄笉鍙潬鐨勩?/p>
鍑虹幇涓婅堪闂, 鏈閲嶈鐨?涓師鍥犲涓? 闂鍑虹幇鐨勯『搴? 涓嶈繃, 涓浜涜憲鍚嶇殑寮婧愭鏋? 鍖呮嫭jive,lenya絳変篃閮藉湪浣跨敤DCL妯″紡, 涓旀湭瑙佷竴浜涙瀬绔紓甯? DCL鐨勬浛浠?Initialize-On-Demand : 緇村熀鐧劇鐨凞CL瑙i噴: http://en.wikipedia.org/wiki/Double-checked_locking DCL鐨勫畬緹庤В鍐蟲柟妗? http://www.theserverside.com/patterns/thread.tss?thread_id=39606 鎬葷粨: 鍘熸枃閾炬帴錛?a rel="bookmark">http://kenwublog.com/explain-java-memory-model-in-detail
濡傛灉澶氫釜綰跨▼鍚屾椂鎵ц涓孌墊湭緇忛攣淇濇姢鐨勪唬鐮佹錛屽緢鏈夊彲鑳芥煇鏉$嚎紼嬪凡緇忔敼鍔ㄤ簡鍙橀噺鐨勫鹼紝浣嗘槸鍏朵粬綰跨▼鍗存棤娉曠湅鍒拌繖涓敼鍔紝渚濈劧鍦ㄦ棫鐨勫彉閲忓間笂榪涜榪愮畻錛屾渶緇堝鑷翠笉鍙鏂欑殑榪愮畻緇撴灉銆?/p>
鍙岄噸媯鏌ラ攣瀹氬け鏁堥棶棰?涓鐩存槸JMM鏃犳硶閬垮厤鐨勭己闄蜂箣涓.浜嗚ВDCL澶辨晥闂, 鍙互甯姪鎴戜滑娣卞叆JMM榪愯鍘熺悊.class Foo
{
private Resource res = null;
public Resource getResource()
{
// 鏅氱殑寤惰繜鍔犺澆
if (res == null)
res = new Resource();
return res;
}
}Class Foo
{
Private Resource res = null;
Public synchronized Resource getResource()
{
// 鑾峰彇瀹炰緥鎿嶄綔浣跨敤鍚屾鏂瑰紡, 鎬ц兘涓嶉珮
If (res == null) res = new Resource();
return res;
}
}Class Foo
{
Private Resource res = null;
Public Resource getResource()
{
If (res == null)
{
//鍙湁鍦ㄧ涓嬈″垵濮嬪寲鏃?鎵嶄嬌鐢ㄥ悓姝ユ柟寮?
synchronized(this)
{
if(res == null)
{
res = new Resource();
}
}
}
return res;
}
}
1, 緙栬瘧鍣ㄤ紭鍖栦簡紼嬪簭鎸囦護, 浠ュ姞蹇玞pu澶勭悊閫熷害.
2, 澶氭牳cpu鍔ㄦ佽皟鏁存寚浠ら『搴? 浠ュ姞蹇茍琛岃繍綆楄兘鍔?
1, 綰跨▼A, 鍙戠幇瀵硅薄鏈疄渚嬪寲, 鍑嗗寮濮嬪疄渚嬪寲
2, 鐢變簬緙栬瘧鍣ㄤ紭鍖栦簡紼嬪簭鎸囦護, 鍏佽瀵硅薄鍦ㄦ瀯閫犲嚱鏁版湭璋冪敤瀹屽墠, 灝?鍏變韓鍙橀噺鐨勫紩鐢ㄦ寚鍚?閮ㄥ垎鏋勯犵殑瀵硅薄, 铏界劧瀵硅薄鏈畬鍏ㄥ疄渚嬪寲, 浣嗗凡緇忎笉涓簄ull浜?
3, 綰跨▼B, 鍙戠幇閮ㄥ垎鏋勯犵殑瀵硅薄宸蹭笉鏄痭ull, 鍒欑洿鎺ヨ繑鍥炰簡璇ュ璞?
璇存槑, DCL澶辨晥闂鐨勫嚭鐜扮巼榪樻槸姣旇緝浣庣殑.
鎺ヤ笅鏉ュ氨鏄ц兘涓庣ǔ瀹氫箣闂寸殑閫夋嫨浜?public class Foo {
// 浼兼湁闈欐佸唴閮ㄧ被, 鍙湁褰撴湁寮曠敤鏃? 璇ョ被鎵嶄細琚杞?/span>
private static class LazyFoo {
public static Foo foo = new Foo();
}
public static Foo getInstance() {
return LazyFoo.foo;
}
}
澶氱嚎紼嬬紪紼? 閽堝鏈夊啓鎿嶄綔鐨勫彉閲? 蹇呴』 淇濊瘉鍏舵墍鏈夊紩鐢ㄧ偣涓庝富瀛樹腑鏁版嵁涓鑷?鑰冭檻閲囩敤鍚屾鎴杤olatile) .
]]>
涓轟粈涔?浣跨敤volatile姣斿悓姝ヤ唬浠鋒洿浣?
鍚屾鐨勪唬浠? 涓昏鐢卞叾瑕嗙洊鑼冨洿鍐沖畾, 濡傛灉鍙互闄嶄綆鍚屾鐨勮鐩栬寖鍥? 鍒欏彲浠ュぇ騫呮彁鍗囩▼搴忔ц兘.
鑰寁olatile鐨勮鐩栬寖鍥翠粎浠呭彉閲忕駭鍒殑. 鍥犳瀹冪殑鍚屾浠d環寰堜綆.
volatile鍘熺悊鏄粈涔?
volatile鐨勮涔? 鍏跺疄鏄憡璇夊鐞嗗櫒, 涓嶈灝嗘垜鏀懼叆宸ヤ綔鍐呭瓨, 璇風洿鎺ュ湪涓誨瓨鎿嶄綔鎴?(宸ヤ綔鍐呭瓨璇﹁java鍐呭瓨妯″瀷)
鍥犳, 褰撳鏍告垨澶氱嚎紼嬪湪璁塊棶璇ュ彉閲忔椂, 閮藉皢鐩存帴 鎿嶄綔 涓誨瓨, 榪欎粠鏈川涓? 鍋氬埌浜嗗彉閲忓叡浜?
volatile鐨勬湁浠涔堜紭鍔?
1, 鏇村ぇ鐨勭▼搴忓悶鍚愰噺
2, 鏇村皯鐨勪唬鐮佸疄鐜板綰跨▼
3, 紼嬪簭鐨勪幾緙╂ц緝濂?br />
4, 姣旇緝濂界悊瑙? 鏃犻渶澶珮鐨勫涔犳垚鏈?/p>
volatile鏈変粈涔堝姡鍔?
1, 瀹規槗鍑洪棶棰?br />
2, 姣旇緝闅捐璁?br />
volatile榪愮畻瀛樺湪鑴忔暟鎹棶棰?
volatile浠呬粎鑳戒繚璇佸彉閲忓彲瑙佹? 鏃犳硶淇濊瘉鍘熷瓙鎬?
volatile鐨剅ace condition紺轟緥:
public class TestRaceCondition {
private volatile int i = 0;
public void increase() {
i++;
}
public int getValue() {
return i;
}
}
褰撳綰跨▼鎵цincrease鏂規硶鏃? 鏄惁鑳戒繚璇佸畠鐨勫間細鏄嚎鎬ч掑鐨勫憿?
絳旀鏄惁瀹氱殑.
鍘熷洜:
榪欓噷鐨刬ncrease鏂規硶, 鎵ц鐨勬搷浣滄槸i++, 鍗?i = i + 1;
閽堝i = i + 1, 鍦ㄥ綰跨▼涓殑榪愮畻, 鏈韓闇瑕佹敼鍙榠鐨勫?
濡傛灉, 鍦╥宸蹭粠鍐呭瓨涓彇鍒版渶鏂板? 浣嗘湭涓?榪涜榪愮畻, 姝ゆ椂鍏朵粬綰跨▼宸叉暟嬈″皢榪愮畻緇撴灉璧嬪肩粰i.
鍒欏綋鍓嶇嚎紼嬬粨鏉熸椂, 涔嬪墠鐨勬暟嬈¤繍綆楃粨鏋滈兘灝嗚瑕嗙洊.
鍗? 鎵ц100嬈ncrease, 鍙兘緇撴灉鏄?< 100.
涓鑸潵璇? 榪欑鎯呭喌闇瑕佽緝楂樼殑鍘嬪姏涓庡茍鍙戞儏鍐典笅, 鎵嶄細鍑虹幇.
濡備綍閬垮厤榪欑鎯呭喌?
瑙e喅浠ヤ笂闂鐨勬柟娉?
涓縐嶆槸 鎿嶄綔鏃? 鍔犱笂鍚屾.
榪欑鏂規硶, 鏃犵枒灝嗗ぇ澶ч檷浣庣▼搴忔ц兘, 涓旇繚鑳屼簡volatile鐨勫垵琛?
絎簩縐嶆柟寮忔槸, 浣跨敤紜歡鍘熻(CAS), 瀹炵幇闈為樆濉炵畻娉?br /> 浠嶤PU鍘熻涓? 鏀寔鍙橀噺綰у埆鐨勪綆寮閿鍚屾.
CPU鍘熻-姣旇緝騫朵氦鎹?CompareAndSet),瀹炵幇闈為樆濉炵畻娉?
浠涔堟槸CAS?
cas鏄幇浠PU鎻愪緵緇欏茍鍙戠▼搴忎嬌鐢ㄧ殑鍘熻鎿嶄綔. 涓嶅悓鐨凜PU鏈変笉鍚岀殑浣跨敤瑙勮寖.
鍦?Intel 澶勭悊鍣ㄤ腑錛屾瘮杈冨茍浜ゆ崲閫氳繃鎸囦護鐨?cmpxchg 緋誨垪瀹炵幇銆?br />
PowerPC 澶勭悊鍣ㄦ湁涓瀵瑰悕涓?#8220;鍔犺澆騫朵繚鐣?#8221;鍜?#8220;鏉′歡瀛樺偍”鐨勬寚浠わ紝瀹冧滑瀹炵幇鐩稿悓鐨勭洰鍦幫紱
MIPS 涓?PowerPC 澶勭悊鍣ㄧ浉浼鹼紝闄や簡絎竴涓寚浠ょО涓?#8220;鍔犺澆閾炬帴”銆?/p>
CAS 鎿嶄綔鍖呭惈涓変釜鎿嶄綔鏁?鈥斺?鍐呭瓨浣嶇疆錛圴錛夈侀鏈熷師鍊鹼紙A錛夊拰鏂板?B)
浠涔堟槸闈為樆濉炵畻娉?
涓涓嚎紼嬬殑澶辮觸鎴栨寕璧蜂笉搴旇褰卞搷鍏朵粬綰跨▼鐨勫け璐ユ垨鎸傝搗.榪欑被綆楁硶縐頒箣涓洪潪闃誨(nonblocking)綆楁硶
瀵規瘮闃誨綆楁硶:
濡傛灉鏈変竴綾誨茍鍙戞搷浣? 鍏朵腑涓涓嚎紼嬩紭鍏堝緱鍒板璞$洃瑙嗗櫒鐨勯攣, 褰撳叾浠栫嚎紼嬪埌杈懼悓姝ヨ竟鐣屾椂, 灝變細琚樆濉?
鐩村埌鍓嶄竴涓嚎紼嬮噴鏀炬帀閿佸悗, 鎵嶅彲浠ョ戶緇珵浜夊璞¢攣.(褰撶劧,榪欓噷鐨勭珵浜変篃鍙槸鍏鉤鐨? 鎸夊厛鏉ュ悗鍒扮殑嬈″簭)
CAS 鍘熺悊:
鎴戣涓轟綅緗?V 搴旇鍖呭惈鍊?A錛涘鏋滃寘鍚鍊鹼紝鍒欏皢 B 鏀懼埌榪欎釜浣嶇疆錛涘惁鍒欙紝涓嶈鏇存敼璇ヤ綅緗紝鍙憡璇夋垜榪欎釜浣嶇疆鐜板湪鐨勫煎嵆鍙?/p>
CAS浣跨敤紺轟緥(jdk 1.5 騫跺彂鍖?AtomicInteger綾誨垎鏋?)
/**
* Atomically sets to the given value and returns the old value.
*
* @param newValue the new value
* @return the previous value
*/
public final int getAndSet(int newValue) {
for (;;) {
int current = get();
if (compareAndSet(current, newValue))
return current;
}
}
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
榪欎釜鏂規硶鏄? AtomicInteger綾葷殑甯哥敤鏂規硶, 浣滅敤鏄? 灝嗗彉閲忚緗負鎸囧畾鍊? 騫惰繑鍥炶緗墠鐨勫?
瀹冨埄鐢ㄤ簡cpu鍘熻compareAndSet鏉ヤ繚闅滃肩殑鍞竴鎬?
鍙? AtomicInteger綾諱腑, 鍏朵粬鐨勫疄鐢ㄦ柟娉? 涔熸槸鍩轟簬鍚屾牱鐨勫疄鐜版柟寮?
姣斿 getAndIncrement, getAndDecrement, getAndAdd絳夌瓑.
CAS璇箟涓婂瓨鍦ㄧ殑 ” ABA 闂”
浠涔堟槸ABA闂?
鍋囪, 絎竴嬈¤鍙朧鍦板潃鐨凙鍊? 鐒跺悗閫氳繃CAS鏉ュ垽鏂璙鍦板潃鐨勫兼槸鍚︿粛鏃т負A, 濡傛灉鏄? 灝卞皢B鐨勫煎啓鍏鍦板潃,瑕嗙洊A鍊?
浣嗘槸, 璇箟涓? 鏈変竴涓紡媧? 褰撶涓嬈¤鍙朧鐨凙鍊? 姝ゆ椂, 鍐呭瓨V鐨勫煎彉涓築鍊? 鐒跺悗鍦ㄦ湭鎵цCAS鍓? 鍙堝彉鍥炰簡A鍊?
姝ゆ椂, CAS鍐嶆墽琛屾椂, 浼氬垽鏂叾姝g‘鐨? 騫惰繘琛岃祴鍊?
榪欑鍒ゆ柇鍊肩殑鏂瑰紡鏉ユ柇瀹氬唴瀛樻槸鍚﹁淇敼榪? 閽堝鏌愪簺闂, 鏄笉閫傜敤鐨?
涓轟簡瑙e喅榪欑闂, jdk 1.5騫跺彂鍖呮彁渚涗簡AtomicStampedReference(鏈夋爣璁扮殑鍘熷瓙寮曠敤)綾? 閫氳繃鎺у埗鍙橀噺鍊肩殑鐗堟湰鏉ヤ繚璇丆AS姝g‘鎬?
鍏跺疄, 澶ч儴鍒嗛氳繃鍊肩殑鍙樺寲鏉AS, 宸茬粡澶熺敤浜?
jdk1.5鍘熷瓙鍖呬粙緇?鍩轟簬volatile)
鍖呯殑鐗硅壊:
1, 鏅氬師瀛愭暟鍊肩被鍨婣tomicInteger, AtomicLong鎻愪緵涓浜涘師瀛愭搷浣滅殑鍔犲噺榪愮畻.
2, 浣跨敤浜嗚В鍐寵剰鏁版嵁闂鐨勭粡鍏告ā寮?”姣斿鍚庤瀹?#8221;, 鍗?鏌ョ湅涓誨瓨涓暟鎹槸鍚︿笌棰勬湡鎻愪緵鐨勫間竴鑷?濡傛灉涓鑷?鎵嶆洿鏂?
3, 浣跨敤AtomicReference鍙互瀹炵幇瀵規墍鏈夊璞$殑鍘熷瓙寮曠敤鍙婅祴鍊?鍖呮嫭Double涓嶧loat,
浣嗕笉鍖呮嫭瀵瑰叾鐨勮綆?嫻偣鐨勮綆?鍙兘渚濋潬鍚屾鍏抽敭瀛楁垨Lock鎺ュ彛鏉ュ疄鐜頒簡.
4, 瀵規暟緇勫厓绱犻噷鐨勫璞?絎﹀悎浠ヤ笂鐗圭偣鐨? 涔熷彲閲囩敤鍘熷瓙鎿嶄綔.鍖呴噷鎻愪緵浜嗕竴浜涙暟緇勫師瀛愭搷浣滅被
AtomicIntegerArray, AtomicLongArray絳夌瓑.
5, 澶у箙搴︽彁鍗囩郴緇熷悶鍚愰噺鍙婃ц兘.
鍏蜂綋浣跨敤, 璇﹁Вjava doc.
鍘熸枃閾炬帴錛?a rel="bookmark">http://kenwublog.com/the-theory-of-volatile