锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
浜掓枼鎬т綋鐜板湪綾婚攣鎴栬呭璞¢攣涓婏紝姣忎釜瀵硅薄鑷韓閮藉寘鍚竴涓洃瑙嗗櫒錛岃鐩戣鍣ㄦ槸涓涓瘡嬈″彧鑳借涓涓嚎紼嬫墍鑾峰彇榪涘叆鐨勪復鐣屽尯錛屽彲浠ラ氳繃wait鍜宯otify鏉ラ鍑哄拰鍑嗗叆涓寸晫鍖恒傚彲浠?/font>鐪嬪嚭榪欐槸涓涓敓浜ц?娑堣垂鑰呯殑妯″瀷銆傝孋oncurrent鍖呬腑鐨凩ock涓轟簡鑳藉鑾峰緱鏇村ソ鐨勬ц兘鍜屾洿濂界殑鎵╁睍鎬э紝浠ュ強涓嶄緷璧栦簬鍏抽敭瀛楃殑鍙浠g爜錛岃嚜宸卞疄鐜頒簡榪欐牱涓涓敓浜ф秷璐歸槦鍒楋紝涔?/font>灝辨槸AbstractQueuedSynchronizer錛岃縐頒負AQS鐨勬満鍒躲傛瘡涓狶ock閮藉唴緗簡涓涓狝bstractQueuedSynchronizer銆傞渶瑕佽鏄庣殑鏄疉bstractQueuedSynchronizer鍐呴儴瀹炵幇閲囩敤浜咰AS鏈哄埗錛岄氳繃getState, setState, compareAndSetState璁塊棶鎺у埗涓涓?2bit int鐨勫艦寮忚繘琛屼簰鏂ャ?/font>
閭d箞鍙鎬ф槸濡備綍淇濊瘉鐨勫憿錛?/font>
瀵逛簬鍏抽敭瀛楃殑鍚屾鏈哄埗錛屽叾瀹炲彲瑙佹у氨鏄嚎紼嬪拰涓誨瓨涔嬮棿鐨勫悓姝ユ椂鏈洪棶棰樸傚叡鏈?涓椂闂寸偣闇瑕佹敞鎰忥細
1 鑾峰彇鎴栭噴鏀劇被閿?瀵硅薄閿佺殑鏃跺欍俆hread淇濊瘉reload/flush鍏ㄩ儴鍙樻洿
2 volatile灝辨槸flush on write鎴栬卹eload on read
3 褰撶嚎紼嬮嬈¤闂叡浜彉閲忔椂錛屽彲浠ュ緱鍒版渶鏂扮殑緇撴灉銆?br />
棰樺錛氭墍浠ュ湪鏋勯犳柟娉曚腑鍏竷this鏃跺緢鍗遍櫓鐨勩傜畝鍗曠殑璇達紝灝辨槸鏋勯犳椂涓嶉冭劚浠諱綍鍙橀噺錛屼笉寮鍚柊鐨勭嚎紼嬶紝鍙仛灝佽銆傚叧浜庡畨鍏ㄦ瀯閫狅紝璇峰弬鑰?br />
http://www.ibm.com/developerworks/cn/java/j-jtp0618/#resources
4 綰跨▼緇撴潫鏃訛紝鎵鏈夊彉鏇翠細鍐欏洖涓誨瓨
鍏充簬Concurrent Lock濡備綍瀹炵幇鍙鎬х殑闂錛孌oug Lea澶т緺錛屽彧鍦ㄤ粬鐨勮鏂囦腑鎻愬埌錛屾寜鐓SR133錛孶nsafe鍦╣etState, setState, compareAndSetState鏃朵繚璇佷簡綰跨▼鐨勫彉閲忕殑鍙鎬э紝涓嶉渶瑕侀澶栫殑volatile鏀寔錛岃嚦浜庡叿浣撹繖浜沶ative鍋氫簡鍝簺magic灝變笉寰楄岀煡浜嗭紝鎬諱箣錛屾渶鍚庣殑contract灝辨槸淇濊瘉lock鍖洪棿鐨勫叡浜彉閲忓彲瑙佹с傚紑鍙戝洟闃熻閫兼ヤ簡灝辮繖鏍峰洖絳旓細
There seems to be a real reluctance to explain the dirty details. I think the question was definitely understood on the concurrent interest thread, and the answer is that synchronized and concurrent locking are intended to be interchangable in terms of memory semantics when implemented correctly. The answer to matfud's question seems to be "trust us.”
涓嶈繃榪欎釜鍦版柟鐨勭‘鏄紑鍙戝洟闃熺粰鎴戜滑鐢ㄦ埛榪鋒儜鐨勫湴鏂癸紝鍦ㄥ悓鏍峰簲鐢ㄤ簡CAS鏈哄埗鐨凙tomic綾諱腑錛岄兘鍐呭祵浜唙olatile鍙橀噺錛屼絾鏄啀lock鍧椾腑錛屼粬鍛婅瘔鎴戜滑鍙互淇濊瘉鍙鎬с?/font>
鎰熷叴瓚g殑鍚屽鍙互涓嬮潰鐨勪袱涓猼hread鍜孌oug Lea鐨則hesis錛?br />
http://altair.cs.oswego.edu/pipermail/concurrency-interest/2005-June/001587.html
http://forums.sun.com/thread.jspa?threadID=631014&start=15&tstart=0
http://gee.cs.oswego.edu/dl/papers/aqs.pdf
鏂囦歡緋葷粺鏃犻潪灝辨槸鏂囦歡鐨勫瓨鍙栧拰緇勭粐緇撴瀯銆?br /> 璁塊棶涓涓枃浠剁郴緇熺殑API涔熷簲璇ユ槸鍐欙紝璇伙紝瀹氫綅鏂規硶錛圥athname?/URI?錛?/p>
FTPClient閽堝鏂囦歡鐨勪繚瀛樺拰鑾峰彇鍚勬彁渚涗簡涓や釜鏂規硶錛屽垎鍒槸錛?br />
涓や釜鏂規硶璨屼技鐩稿悓錛屽疄闄呬笉鍚岋紝榪斿洖嫻佺殑閭d釜鍥犱負涓嶈兘椹笂澶勭悊嫻侊紝鎵浠ラ渶瑕佺敤鎴鋒墜宸ヨ皟鐢╟ompletePendingCommand錛岃屽彟涓涓紶閫掓祦榪涘幓鐨勫垯涓嶉渶瑕併傚彲鑳芥湁鍚屽宸茬粡閬囧埌榪囪繖涓棶棰樹簡錛岃鍐欑涓涓枃浠舵椂鎬繪槸姝g‘鐨勶紝褰撶浉鍚孉PI璇誨啓絎簩涓枃浠舵椂錛宐lock浣忎簡銆傝繖鏄洜涓篎TPClient瑕佹眰鍦ㄨ繘琛屾祦鎿嶄綔涔嬪悗鎵цcompletePendingCommand錛屼互紜繚嫻佸鐞嗗畬姣曪紝鍥犱負嫻佸鐞嗕笉鏄嵆鏃剁殑錛屾墍浠ヤ篃娌℃湁鍔炴硶涓嶆墜宸ヨ皟鐢╟ompletePendingCommand銆傞棶棰樻槸寮鍙戣呮妸涓嶈繑鍥炴祦鐨勬柟娉曟湯灝懼姞涓婁簡completePendingCommand錛屽鏋滀笉鐪嬩唬鐮佸彲鑳芥牴鏈笉鐭ラ亾銆?br /> 鏂囨。涓婅錛?br />
浣嗘槸榪欐牱浠嶇劧榪樻槸璁╀漢鏈夌偣鍥版儜錛屼負浠涔堥兘鏄瓨鍌?璇誨彇鐨勬柟娉曪紝鏈夋椂鍊欒璋冪敤completePendingCommand錛屾湁鏃跺欎笉璋冪敤錛熸洿涓ラ噸鐨勯棶棰樻槸completePendingCommand璋冪敤浜唃etReply錛屽鏋滀竴涓懡浠ら氳繃socket stream浼犱簡榪囧幓浣嗘槸娌℃湁getReply錛屽嵆娌℃湁completePendingCommand錛岄偅涔堜笅嬈″彂鍛戒護鏃訛紝灝嗕細鍙楀埌鏈榪斿洖鐮佺殑騫叉壈錛屽緱鍒版棤鏁堢殑鍝嶅簲銆傝屽鏋滃湪completePendingCommand涔嬪悗鍙堣繘琛屼簡涓嬈℃棤杈滅殑completePendingCommand錛岄偅涔堝洜涓篎TP Server涓婃病鏈塕eply浜嗭紝灝變細block銆傛墍浠ompletePendingCommand騫朵笉鏄彲浠ラ殢鎰忔坊鍔犵殑銆?/p>
鐜板湪鍑虹幇浜嗕袱涓棶棰橈細
1 completePendingCommand寰堝鏄撳鍑烘潵鎴栭仐婕?br />
2 鏄懼紡璋冪敤completePendingCommand鏆撮湶浜嗗簳灞傚疄鐜幫紝緇欑敤鎴峰甫鏉ヤ笉渚匡紝鐢ㄦ埛鍙兂瑕両nputStream鎴栬匫utputStream
涓轟簡瑙e喅榪欎釜闂錛屽彲浠ュInputStream榪涜鎵╁睍錛屽緩绔嬩竴涓猂eplyOnCloseInputStream錛屽涓嬶細
榪欐牱灝佽涔嬪悗錛孎TPClient鐨勭敤鎴峰彧闇瑕佹甯稿湪澶勭悊瀹屾祦涔嬪悗鍏抽棴鍗沖彲錛岃屼笉蹇呮毚闇插疄鐜扮粏鑺傘備繚瀛樻枃浠朵篃鍙互鐢ㄧ浉鍚岀殑鏂規硶灝佽OutputStream銆?/p>