锘??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲色欲色欲www在线播放,亚洲狠狠色丁香婷婷综合,亚洲日韩乱码中文无码蜜桃臀http://m.tkk7.com/zhuofan/category/43483.htmlzh-cnMon, 11 Jan 2010 20:24:52 GMTMon, 11 Jan 2010 20:24:52 GMT60錛堣漿錛塉ava杞婚噺綰ч攣鍘熺悊璇﹁В(Lightweight Locking)http://m.tkk7.com/zhuofan/articles/308755.html鍗撳嚒鍗撳嚒Fri, 08 Jan 2010 09:59:00 GMThttp://m.tkk7.com/zhuofan/articles/308755.htmlhttp://m.tkk7.com/zhuofan/comments/308755.htmlhttp://m.tkk7.com/zhuofan/articles/308755.html#Feedback0http://m.tkk7.com/zhuofan/comments/commentRss/308755.htmlhttp://m.tkk7.com/zhuofan/services/trackbacks/308755.html澶у鐭ラ亾錛孞ava鐨勫綰跨▼瀹夊叏鏄熀浜嶭ock鏈哄埗瀹炵幇鐨勶紝鑰孡ock鐨勬ц兘寰寰涓嶅浜烘剰銆?br /> 鍘熷洜鏄紝monitorenter涓巑onitorexit榪欎袱涓帶鍒跺綰跨▼鍚屾鐨刡ytecode鍘熻錛屾槸JVM渚濊禆鎿嶄綔緋葷粺浜掓枼(mutex)鏉ュ疄鐜扮殑銆?br /> 浜掓枼鏄竴縐嶄細瀵艱嚧綰跨▼鎸傝搗錛屽茍鍦ㄨ緝鐭殑鏃墮棿鍐呭張闇瑕侀噸鏂拌皟搴﹀洖鍘熺嚎紼嬬殑錛岃緝涓烘秷鑰楄祫婧愮殑鎿嶄綔銆?/p>

涓轟簡浼樺寲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>

exchange_pointer_1

鏈鍚庝竴姝nlock涓紝鎴戜滑鍙戠幇錛孞VM鍚屾牱浣跨敤浜咰AS鏉ラ獙璇乷bject mark word鍦ㄦ寔鏈夐攣鍒伴噴鏀鵑攣涔嬮棿錛屾湁鏃犺鍏朵粬綰跨▼璁塊棶銆?br /> 濡傛灉鍏朵粬綰跨▼鍦ㄦ寔鏈夐攣榪欐鏃墮棿閲岋紝灝濊瘯鑾峰彇榪囬攣錛屽垯鍙兘鑷韓琚寕璧鳳紝鑰宮ark word鐨勯噸閲忕駭閿佹寚閽堜篃浼氳鐩稿簲淇敼銆?br /> 姝ゆ椂錛寀nlock鍚庡氨闇瑕佸敜閱掕鎸傝搗鐨勭嚎紼嬨?/p>

鍘熸枃閾炬帴錛?a rel="bookmark">http://kenwublog.com/theory-of-lightweight-locking-upon-cas



鍗撳嚒 2010-01-08 17:59 鍙戣〃璇勮
]]>
錛堣漿錛塲ava鍐呭瓨妯″瀷璇﹁Вhttp://m.tkk7.com/zhuofan/articles/308754.html鍗撳嚒鍗撳嚒Fri, 08 Jan 2010 09:58:00 GMThttp://m.tkk7.com/zhuofan/articles/308754.htmlhttp://m.tkk7.com/zhuofan/comments/308754.htmlhttp://m.tkk7.com/zhuofan/articles/308754.html#Feedback0http://m.tkk7.com/zhuofan/comments/commentRss/308754.htmlhttp://m.tkk7.com/zhuofan/services/trackbacks/308754.html 鍐呭瓨妯″瀷 (memory model)
鍐呭瓨妯″瀷鎻忚堪鐨勬槸紼嬪簭涓悇鍙橀噺錛堝疄渚嬪煙銆侀潤鎬佸煙鍜屾暟緇勫厓绱狅級涔嬮棿鐨勫叧緋伙紝浠ュ強鍦ㄥ疄闄呰綆楁満緋葷粺涓皢鍙橀噺瀛樺偍鍒板唴瀛樺拰浠庡唴瀛樺彇鍑哄彉閲忚繖鏍風殑浣庡眰緇嗚妭.

涓嶅悓騫沖彴闂寸殑澶勭悊鍣ㄦ灦鏋勫皢鐩存帴褰卞搷鍐呭瓨妯″瀷鐨勭粨鏋?

鍦–鎴朇++涓? 鍙互鍒╃敤涓嶅悓鎿嶄綔騫沖彴涓嬬殑鍐呭瓨妯″瀷鏉ョ紪鍐欏茍鍙戠▼搴? 浣嗘槸, 榪欏甫緇欏紑鍙戜漢鍛樼殑鏄? 鏇撮珮鐨勫涔犳垚鏈?
鐩告瘮涔嬩笅, 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 /> java鍐呭瓨妯″瀷

鍏朵腑, 宸ヤ綔鍐呭瓨閲岀殑鍙橀噺, 鍦ㄥ鏍稿鐞嗗櫒涓? 灝嗗ぇ閮ㄥ垎鍌ㄥ瓨浜庡鐞嗗櫒楂橀熺紦瀛樹腑, 楂橀熺紦瀛樺湪涓嶇粡榪囧唴瀛樻椂, 涔熸槸涓嶅彲瑙佺殑.

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鐨勪緥瀛?
happens-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>
濡傛灉澶氫釜綰跨▼鍚屾椂鎵ц涓孌墊湭緇忛攣淇濇姢鐨勪唬鐮佹錛屽緢鏈夊彲鑳芥煇鏉$嚎紼嬪凡緇忔敼鍔ㄤ簡鍙橀噺鐨勫鹼紝浣嗘槸鍏朵粬綰跨▼鍗存棤娉曠湅鍒拌繖涓敼鍔紝渚濈劧鍦ㄦ棫鐨勫彉閲忓間笂榪涜榪愮畻錛屾渶緇堝鑷翠笉鍙鏂欑殑榪愮畻緇撴灉銆?/p>

緇忓吀j2ee璁捐妯″紡Double-Checked Locking澶辨晥闂
鍙岄噸媯鏌ラ攣瀹氬け鏁堥棶棰?涓鐩存槸JMM鏃犳硶閬垮厤鐨勭己闄蜂箣涓.浜嗚ВDCL澶辨晥闂, 鍙互甯姪鎴戜滑娣卞叆JMM榪愯鍘熺悊.

瑕佸睍紺篋CL澶辨晥闂, 棣栧厛瑕佺悊瑙d竴涓噸瑕佹蹇? 寤惰繜鍔犺澆(lazy loading).

闈炲崟渚嬬殑鍗曠嚎紼嬪歡榪熷姞杞界ず渚?

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;

}

}

闈炲崟渚嬬殑 DCL澶氱嚎紼嬪歡榪熷姞杞界ず渚?

Class Foo

{

Private Resource res = null;

Public Resource getResource()

{

If (res == null)

{

//鍙湁鍦ㄧ涓嬈″垵濮嬪寲鏃?鎵嶄嬌鐢ㄥ悓姝ユ柟寮?

synchronized(this)

{

if(res == null)

{

res = new Resource();

}

}

}

return res;

}

}

Double-Checked Locking鐪嬭搗鏉ユ槸闈炲父瀹岀編鐨勩備絾鏄緢閬楁喚錛屾牴鎹甁ava鐨勮璦瑙勮寖錛屼笂闈㈢殑浠g爜鏄笉鍙潬鐨勩?/p>

鍑虹幇涓婅堪闂, 鏈閲嶈鐨?涓師鍥犲涓?
1, 緙栬瘧鍣ㄤ紭鍖栦簡紼嬪簭鎸囦護, 浠ュ姞蹇玞pu澶勭悊閫熷害.
2, 澶氭牳cpu鍔ㄦ佽皟鏁存寚浠ら『搴? 浠ュ姞蹇茍琛岃繍綆楄兘鍔?

闂鍑虹幇鐨勯『搴?
1, 綰跨▼A, 鍙戠幇瀵硅薄鏈疄渚嬪寲, 鍑嗗寮濮嬪疄渚嬪寲
2, 鐢變簬緙栬瘧鍣ㄤ紭鍖栦簡紼嬪簭鎸囦護, 鍏佽瀵硅薄鍦ㄦ瀯閫犲嚱鏁版湭璋冪敤瀹屽墠, 灝?鍏變韓鍙橀噺鐨勫紩鐢ㄦ寚鍚?閮ㄥ垎鏋勯犵殑瀵硅薄, 铏界劧瀵硅薄鏈畬鍏ㄥ疄渚嬪寲, 浣嗗凡緇忎笉涓簄ull浜?
3, 綰跨▼B, 鍙戠幇閮ㄥ垎鏋勯犵殑瀵硅薄宸蹭笉鏄痭ull, 鍒欑洿鎺ヨ繑鍥炰簡璇ュ璞?

涓嶈繃, 涓浜涜憲鍚嶇殑寮婧愭鏋? 鍖呮嫭jive,lenya絳変篃閮藉湪浣跨敤DCL妯″紡, 涓旀湭瑙佷竴浜涙瀬绔紓甯?
璇存槑, DCL澶辨晥闂鐨勫嚭鐜扮巼榪樻槸姣旇緝浣庣殑.
鎺ヤ笅鏉ュ氨鏄ц兘涓庣ǔ瀹氫箣闂寸殑閫夋嫨浜?

DCL鐨勬浛浠?Initialize-On-Demand :

public class Foo {

// 浼兼湁闈欐佸唴閮ㄧ被, 鍙湁褰撴湁寮曠敤鏃? 璇ョ被鎵嶄細琚杞?/span>

private static class LazyFoo {

public static Foo foo = new Foo();

}

 

public static Foo getInstance() {

return LazyFoo.foo;

}

}

緇村熀鐧劇鐨凞CL瑙i噴:

http://en.wikipedia.org/wiki/Double-checked_locking

DCL鐨勫畬緹庤В鍐蟲柟妗?

http://www.theserverside.com/patterns/thread.tss?thread_id=39606

鎬葷粨:
澶氱嚎紼嬬紪紼? 閽堝鏈夊啓鎿嶄綔鐨勫彉閲? 蹇呴』 淇濊瘉鍏舵墍鏈夊紩鐢ㄧ偣涓庝富瀛樹腑鏁版嵁涓鑷?鑰冭檻閲囩敤鍚屾鎴杤olatile) .

鍘熸枃閾炬帴錛?a rel="bookmark">http://kenwublog.com/explain-java-memory-model-in-detail



鍗撳嚒 2010-01-08 17:58 鍙戣〃璇勮
]]>
(杞?volatile鍘熺悊涓庢妧宸?/title><link>http://m.tkk7.com/zhuofan/articles/308753.html</link><dc:creator>鍗撳嚒</dc:creator><author>鍗撳嚒</author><pubDate>Fri, 08 Jan 2010 09:57:00 GMT</pubDate><guid>http://m.tkk7.com/zhuofan/articles/308753.html</guid><wfw:comment>http://m.tkk7.com/zhuofan/comments/308753.html</wfw:comment><comments>http://m.tkk7.com/zhuofan/articles/308753.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/zhuofan/comments/commentRss/308753.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/zhuofan/services/trackbacks/308753.html</trackback:ping><description><![CDATA[<p><span style="font-size: 15px; font-weight: bold;"> volatile, 鐢ㄦ洿浣庣殑浠d環鏇夸唬鍚屾</span></p> <p><strong>涓轟粈涔?浣跨敤volatile姣斿悓姝ヤ唬浠鋒洿浣? </strong><br /> 鍚屾鐨勪唬浠? 涓昏鐢卞叾瑕嗙洊鑼冨洿鍐沖畾, 濡傛灉鍙互闄嶄綆鍚屾鐨勮鐩栬寖鍥? 鍒欏彲浠ュぇ騫呮彁鍗囩▼搴忔ц兘.</p> <p>鑰寁olatile鐨勮鐩栬寖鍥翠粎浠呭彉閲忕駭鍒殑. 鍥犳瀹冪殑鍚屾浠d環寰堜綆.</p> <p><strong>volatile鍘熺悊鏄粈涔?</strong><br /> volatile鐨勮涔? 鍏跺疄鏄憡璇夊鐞嗗櫒, 涓嶈灝嗘垜鏀懼叆宸ヤ綔鍐呭瓨, 璇風洿鎺ュ湪涓誨瓨鎿嶄綔鎴?(宸ヤ綔鍐呭瓨璇﹁java鍐呭瓨妯″瀷)</p> <p>鍥犳, 褰撳鏍告垨澶氱嚎紼嬪湪璁塊棶璇ュ彉閲忔椂, 閮藉皢鐩存帴 鎿嶄綔 涓誨瓨, 榪欎粠鏈川涓? 鍋氬埌浜嗗彉閲忓叡浜?</p> <p><strong>volatile鐨勬湁浠涔堜紭鍔? </strong><br /> 1, 鏇村ぇ鐨勭▼搴忓悶鍚愰噺<br /> 2, 鏇村皯鐨勪唬鐮佸疄鐜板綰跨▼<br /> 3, 紼嬪簭鐨勪幾緙╂ц緝濂?br /> 4, 姣旇緝濂界悊瑙? 鏃犻渶澶珮鐨勫涔犳垚鏈?/p> <p><strong>volatile鏈変粈涔堝姡鍔? </strong><br /> 1, 瀹規槗鍑洪棶棰?br /> 2, 姣旇緝闅捐璁?br /> </p> <p><span style="font-size: 15px; font-weight: bold;"> volatile榪愮畻瀛樺湪鑴忔暟鎹棶棰?</span></p> <p>volatile浠呬粎鑳戒繚璇佸彉閲忓彲瑙佹? 鏃犳硶淇濊瘉鍘熷瓙鎬?</p> <p>volatile鐨剅ace condition紺轟緥:</p> <div id="lzdvbjh" class="wp_syntax"> <div id="j3ztnt9" class="code"> <pre class="java" style="font-family: monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TestRaceCondition <span style="color: #009900;">{</span><br /> <br /> <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">volatile</span> <span style="color: #000066; font-weight: bold;">int</span> i <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span><br /> <br />  <br /> <br /> <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> increase<span style="color: #009900;">(</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span><br /> <br /> i<span style="color: #339933;">++;</span><br /> <br /> <span style="color: #009900;">}</span><br /> <br />  <br /> <br /> <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> getValue<span style="color: #009900;">(</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span><br /> <br /> <span style="color: #000000; font-weight: bold;">return</span> i<span style="color: #339933;">;</span><br /> <br /> <span style="color: #009900;">}</span><br /> <br /> <span style="color: #009900;">}</span></pre> </div> </div> <p><strong>褰撳綰跨▼鎵цincrease鏂規硶鏃? 鏄惁鑳戒繚璇佸畠鐨勫間細鏄嚎鎬ч掑鐨勫憿? </strong><br /> 絳旀鏄惁瀹氱殑.</p> <p>鍘熷洜:<br /> 榪欓噷鐨刬ncrease鏂規硶, 鎵ц鐨勬搷浣滄槸i++, 鍗?i = i + 1;<br /> 閽堝i = i + 1, 鍦ㄥ綰跨▼涓殑榪愮畻, 鏈韓闇瑕佹敼鍙榠鐨勫?<br /> 濡傛灉, 鍦╥宸蹭粠鍐呭瓨涓彇鍒版渶鏂板? 浣嗘湭涓?榪涜榪愮畻, 姝ゆ椂鍏朵粬綰跨▼宸叉暟嬈″皢榪愮畻緇撴灉璧嬪肩粰i.<br /> 鍒欏綋鍓嶇嚎紼嬬粨鏉熸椂, 涔嬪墠鐨勬暟嬈¤繍綆楃粨鏋滈兘灝嗚瑕嗙洊.</p> <p>鍗? 鎵ц100嬈ncrease, 鍙兘緇撴灉鏄?< 100.<br /> 涓鑸潵璇? 榪欑鎯呭喌闇瑕佽緝楂樼殑鍘嬪姏涓庡茍鍙戞儏鍐典笅, 鎵嶄細鍑虹幇.</p> <p><strong>濡備綍閬垮厤榪欑鎯呭喌? </strong><br /> 瑙e喅浠ヤ笂闂鐨勬柟娉?<br /> 涓縐嶆槸 鎿嶄綔鏃? 鍔犱笂鍚屾.<br /> 榪欑鏂規硶, 鏃犵枒灝嗗ぇ澶ч檷浣庣▼搴忔ц兘, 涓旇繚鑳屼簡volatile鐨勫垵琛?</p> <p>絎簩縐嶆柟寮忔槸, 浣跨敤紜歡鍘熻(CAS), 瀹炵幇闈為樆濉炵畻娉?br /> 浠嶤PU鍘熻涓? 鏀寔鍙橀噺綰у埆鐨勪綆寮閿鍚屾.</p> <p><span style="font-size: 15px; font-weight: bold;"> CPU鍘熻-姣旇緝騫朵氦鎹?CompareAndSet),瀹炵幇闈為樆濉炵畻娉?</span></p> <p><strong>浠涔堟槸CAS? </strong><br /> cas鏄幇浠PU鎻愪緵緇欏茍鍙戠▼搴忎嬌鐢ㄧ殑鍘熻鎿嶄綔. 涓嶅悓鐨凜PU鏈変笉鍚岀殑浣跨敤瑙勮寖.</p> <p>鍦?Intel 澶勭悊鍣ㄤ腑錛屾瘮杈冨茍浜ゆ崲閫氳繃鎸囦護鐨?cmpxchg 緋誨垪瀹炵幇銆?br /> PowerPC 澶勭悊鍣ㄦ湁涓瀵瑰悕涓?#8220;鍔犺澆騫朵繚鐣?#8221;鍜?#8220;鏉′歡瀛樺偍”鐨勬寚浠わ紝瀹冧滑瀹炵幇鐩稿悓鐨勭洰鍦幫紱<br /> MIPS 涓?PowerPC 澶勭悊鍣ㄧ浉浼鹼紝闄や簡絎竴涓寚浠ょО涓?#8220;鍔犺澆閾炬帴”銆?/p> <p>CAS 鎿嶄綔鍖呭惈涓変釜鎿嶄綔鏁?鈥斺?鍐呭瓨浣嶇疆錛圴錛夈侀鏈熷師鍊鹼紙A錛夊拰鏂板?B)</p> <p><strong>浠涔堟槸闈為樆濉炵畻娉? </strong><br /> 涓涓嚎紼嬬殑澶辮觸鎴栨寕璧蜂笉搴旇褰卞搷鍏朵粬綰跨▼鐨勫け璐ユ垨鎸傝搗.榪欑被綆楁硶縐頒箣涓洪潪闃誨(nonblocking)綆楁硶</p> <p>瀵規瘮闃誨綆楁硶:<br /> 濡傛灉鏈変竴綾誨茍鍙戞搷浣? 鍏朵腑涓涓嚎紼嬩紭鍏堝緱鍒板璞$洃瑙嗗櫒鐨勯攣, 褰撳叾浠栫嚎紼嬪埌杈懼悓姝ヨ竟鐣屾椂, 灝變細琚樆濉?<br /> 鐩村埌鍓嶄竴涓嚎紼嬮噴鏀炬帀閿佸悗, 鎵嶅彲浠ョ戶緇珵浜夊璞¢攣.(褰撶劧,榪欓噷鐨勭珵浜変篃鍙槸鍏鉤鐨? 鎸夊厛鏉ュ悗鍒扮殑嬈″簭)</p> <p><strong>CAS 鍘熺悊: </strong></p> <p>鎴戣涓轟綅緗?V 搴旇鍖呭惈鍊?A錛涘鏋滃寘鍚鍊鹼紝鍒欏皢 B 鏀懼埌榪欎釜浣嶇疆錛涘惁鍒欙紝涓嶈鏇存敼璇ヤ綅緗紝鍙憡璇夋垜榪欎釜浣嶇疆鐜板湪鐨勫煎嵆鍙?/p> <p>CAS浣跨敤紺轟緥(jdk 1.5 騫跺彂鍖?AtomicInteger綾誨垎鏋?)</p> <div id="jrdfp9z" class="wp_syntax"> <div id="ljdpz9n" class="code"> <pre class="java" style="font-family: monospace;"><span style="color: #008000; font-style: italic; font-weight: bold;">/**<br /> <br /> * Atomically sets to the given value and returns the old value.<br /> <br /> *<br /> <br /> * @param newValue the new value<br /> <br /> * @return the previous value<br /> <br /> */</span><br /> <br /> <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">int</span> getAndSet<span style="color: #009900;">(</span><span style="color: #000066; font-weight: bold;">int</span> newValue<span style="color: #009900;">)</span> <span style="color: #009900;">{</span><br /> <br /> <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">(</span><span style="color: #339933;">;;</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span><br /> <br /> <span style="color: #000066; font-weight: bold;">int</span> current <span style="color: #339933;">=</span> get<span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span><br /> <br /> <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">(</span>compareAndSet<span style="color: #009900;">(</span>current, newValue<span style="color: #009900;">)</span><span style="color: #009900;">)</span><br /> <br /> <span style="color: #000000; font-weight: bold;">return</span> current<span style="color: #339933;">;</span><br /> <br /> <span style="color: #009900;">}</span><br /> <br /> <span style="color: #009900;">}</span><br /> <br />  <br /> <br /> <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">boolean</span> compareAndSet<span style="color: #009900;">(</span><span style="color: #000066; font-weight: bold;">int</span> expect, <span style="color: #000066; font-weight: bold;">int</span> update<span style="color: #009900;">)</span> <span style="color: #009900;">{</span><br /> <br /> <span style="color: #000000; font-weight: bold;">return</span> unsafe.<span style="color: #006633;">compareAndSwapInt</span><span style="color: #009900;">(</span><span style="color: #000000; font-weight: bold;">this</span>, valueOffset, expect, update<span style="color: #009900;">)</span><span style="color: #339933;">;</span><br /> <br /> <span style="color: #009900;">}</span></pre> </div> </div> <p>榪欎釜鏂規硶鏄? AtomicInteger綾葷殑甯哥敤鏂規硶, 浣滅敤鏄? 灝嗗彉閲忚緗負鎸囧畾鍊? 騫惰繑鍥炶緗墠鐨勫?<br /> 瀹冨埄鐢ㄤ簡cpu鍘熻compareAndSet鏉ヤ繚闅滃肩殑鍞竴鎬?</p> <p>鍙? AtomicInteger綾諱腑, 鍏朵粬鐨勫疄鐢ㄦ柟娉? 涔熸槸鍩轟簬鍚屾牱鐨勫疄鐜版柟寮?<br /> 姣斿 getAndIncrement, getAndDecrement, getAndAdd絳夌瓑.</p> <p><span style="font-size: 15px; font-weight: bold;"> CAS璇箟涓婂瓨鍦ㄧ殑 ” ABA 闂”</span></p> <p><strong>浠涔堟槸ABA闂?</strong><br /> 鍋囪, 絎竴嬈¤鍙朧鍦板潃鐨凙鍊? 鐒跺悗閫氳繃CAS鏉ュ垽鏂璙鍦板潃鐨勫兼槸鍚︿粛鏃т負A, 濡傛灉鏄? 灝卞皢B鐨勫煎啓鍏鍦板潃,瑕嗙洊A鍊?</p> <p>浣嗘槸, 璇箟涓? 鏈変竴涓紡媧? 褰撶涓嬈¤鍙朧鐨凙鍊? 姝ゆ椂, 鍐呭瓨V鐨勫煎彉涓築鍊? 鐒跺悗鍦ㄦ湭鎵цCAS鍓? 鍙堝彉鍥炰簡A鍊?<br /> 姝ゆ椂, CAS鍐嶆墽琛屾椂, 浼氬垽鏂叾姝g‘鐨? 騫惰繘琛岃祴鍊?</p> <p>榪欑鍒ゆ柇鍊肩殑鏂瑰紡鏉ユ柇瀹氬唴瀛樻槸鍚﹁淇敼榪? 閽堝鏌愪簺闂, 鏄笉閫傜敤鐨?</p> <p>涓轟簡瑙e喅榪欑闂, jdk 1.5騫跺彂鍖呮彁渚涗簡AtomicStampedReference(鏈夋爣璁扮殑鍘熷瓙寮曠敤)綾? 閫氳繃鎺у埗鍙橀噺鍊肩殑鐗堟湰鏉ヤ繚璇丆AS姝g‘鎬?</p> <p>鍏跺疄, 澶ч儴鍒嗛氳繃鍊肩殑鍙樺寲鏉AS, 宸茬粡澶熺敤浜?</p> <p><span style="font-size: 15px; font-weight: bold;"> jdk1.5鍘熷瓙鍖呬粙緇?鍩轟簬volatile) </span></p> <p>鍖呯殑鐗硅壊:<br /> 1, 鏅氬師瀛愭暟鍊肩被鍨婣tomicInteger, AtomicLong鎻愪緵涓浜涘師瀛愭搷浣滅殑鍔犲噺榪愮畻.</p> <p>2, 浣跨敤浜嗚В鍐寵剰鏁版嵁闂鐨勭粡鍏告ā寮?”姣斿鍚庤瀹?#8221;, 鍗?鏌ョ湅涓誨瓨涓暟鎹槸鍚︿笌棰勬湡鎻愪緵鐨勫間竴鑷?濡傛灉涓鑷?鎵嶆洿鏂?</p> <p>3, 浣跨敤AtomicReference鍙互瀹炵幇瀵規墍鏈夊璞$殑鍘熷瓙寮曠敤鍙婅祴鍊?鍖呮嫭Double涓嶧loat,<br /> 浣嗕笉鍖呮嫭瀵瑰叾鐨勮綆?嫻偣鐨勮綆?鍙兘渚濋潬鍚屾鍏抽敭瀛楁垨Lock鎺ュ彛鏉ュ疄鐜頒簡.</p> <p>4, 瀵規暟緇勫厓绱犻噷鐨勫璞?絎﹀悎浠ヤ笂鐗圭偣鐨? 涔熷彲閲囩敤鍘熷瓙鎿嶄綔.鍖呴噷鎻愪緵浜嗕竴浜涙暟緇勫師瀛愭搷浣滅被<br /> AtomicIntegerArray, AtomicLongArray絳夌瓑.</p> <p>5, 澶у箙搴︽彁鍗囩郴緇熷悶鍚愰噺鍙婃ц兘.</p> <p>鍏蜂綋浣跨敤, 璇﹁Вjava doc.</p> <p>鍘熸枃閾炬帴錛?a rel="bookmark">http://kenwublog.com/the-theory-of-volatile</a></p> <img src ="http://m.tkk7.com/zhuofan/aggbug/308753.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/zhuofan/" target="_blank">鍗撳嚒</a> 2010-01-08 17:57 <a href="http://m.tkk7.com/zhuofan/articles/308753.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>感谢您访问我们的网站,您可能还对以下资源感兴趣:</p> <a href="http://m.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> 主站蜘蛛池模板: <a href="http://xxxxyz.com" target="_blank">午夜宅男在线永久免费观看网</a>| <a href="http://gnebs.com" target="_blank">特级做A爰片毛片免费看无码</a>| <a href="http://cytanhuang.com" target="_blank">亚洲中文字幕无码av永久</a>| <a href="http://www-8908.com" target="_blank">亚洲精品中文字幕</a>| <a href="http://bcz123.com" target="_blank">A级毛片高清免费视频在线播放</a>| <a href="http://szwangzhongwang.com" target="_blank">91福利视频免费</a>| <a href="http://q2c6.com" target="_blank">国产一级大片免费看</a>| <a href="http://ywzms.com" target="_blank">精品久久久久久亚洲</a>| <a href="http://69xjk.com" target="_blank">亚洲精品无码mv在线观看网站</a>| <a href="http://69xjk.com" target="_blank">成在线人视频免费视频</a>| <a href="http://ur5r2kr.com" target="_blank">成年人网站在线免费观看</a>| <a href="http://www73234.com" target="_blank">久久久青草青青国产亚洲免观</a>| <a href="http://01shanzhai.com" target="_blank">亚洲无删减国产精品一区</a>| <a href="http://caobi97.com" target="_blank">麻豆91免费视频</a>| <a href="http://www137av.com" target="_blank">www视频免费看</a>| <a href="http://0917xzb.com" target="_blank">国产成人精品日本亚洲专区</a>| <a href="http://cih60o.com" target="_blank">亚洲精品美女网站</a>| <a href="http://520baoyu.com" target="_blank">99爱在线精品视频免费观看9</a>| <a href="http://pufenghotel.com" target="_blank">亚洲AV无码成H人在线观看</a>| <a href="http://www91v.com" target="_blank">亚洲明星合成图综合区在线</a>| <a href="http://51wdn.com" target="_blank">一级毛片免费播放试看60分钟</a>| <a href="http://amgzh.com" target="_blank">亚色九九九全国免费视频</a>| <a href="http://mlhcd.com" target="_blank">亚洲午夜久久影院</a>| <a href="http://www454yu.com" target="_blank">国产1024精品视频专区免费</a>| <a href="http://www4jbd.com" target="_blank">激情小说亚洲图片</a>| <a href="http://k8h9.com" target="_blank">免费做爰猛烈吃奶摸视频在线观看</a>| <a href="http://zcrencai.com" target="_blank">亚洲国产成人久久综合一</a>| <a href="http://jjwgzx.com" target="_blank">国产在线观看麻豆91精品免费 </a>| <a href="http://jcthbank.com" target="_blank">亚洲精品国产肉丝袜久久</a>| <a href="http://fuhui123.com" target="_blank">国产精品成人免费观看</a>| <a href="http://jdvgo.com" target="_blank">免费人成网站在线播放</a>| <a href="http://otkaxap.com" target="_blank">亚洲成a人片在线不卡一二三区 </a>| <a href="http://qinglou31.com" target="_blank">国产高潮流白浆喷水免费A片 </a>| <a href="http://wwwkckc.com" target="_blank">亚洲av之男人的天堂网站</a>| <a href="http://xxxxxxxxcccc.com" target="_blank">和老外3p爽粗大免费视频</a>| <a href="http://sdzntg.com" target="_blank">国产精品久久久久影院免费</a>| <a href="http://www1688mz.com" target="_blank">亚洲香蕉在线观看</a>| <a href="http://77tok.com" target="_blank">亚欧免费视频一区二区三区</a>| <a href="http://155lh.com" target="_blank">激情小说亚洲色图</a>| <a href="http://amjt9.com" target="_blank">亚洲美女在线观看播放</a>| <a href="http://zdxxxx.com" target="_blank">青青青国产在线观看免费</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>