当前位置: 首页 > 后端技术 > Java

深入分析Synchronized锁升级原理及过程

时间:2023-04-02 09:14:25 Java

Synchronized閿佸崌绾у師鐞嗗強娣卞叆鍒嗘瀽杩囩▼鍓嶈█鍦ㄤ笂涓€绡囨繁鍏ュ涔燬ynchronized鐨勫悇绉嶄娇鐢ㄦ柟娉曚腑锛屾垜浠粩缁嗕粙缁嶄簡濡備綍浣跨敤鍚勭鎯呭喌涓嬬殑synchronized鍏抽敭瀛椼€傚洜涓簊ynchronized鍏抽敭瀛楀湪鎴戜滑鍐欑殑绋嬪簭涓彲鑳戒細缁忓父鐢ㄥ埌锛屾墍浠VM瀵箂ynchronized鍋氫簡寰堝浼樺寲銆傚湪杩欑瘒鏂囩珷涓紝鎴戜滑灏嗚缁嗕粙缁岼VM瀵箂ynchronized鐨勫悇绉嶄紭鍖栫粏鑺傘€傚伐鍏峰噯澶囧湪姝e紡璁瞫ynchronized鐨勫師鐞嗕箣鍓嶏紝鍏堣璇磋嚜鏃嬮攣锛屽洜涓鸿嚜鏃嬮攣鍦╯ynchronized鐨勪紭鍖栦腑璧峰埌浜嗗緢澶х殑浣滅敤銆傝鐞嗚В鑷棆閿侊紝鎴戜滑棣栧厛闇€瑕佺悊瑙d粈涔堟槸鍘熷瓙鎬с€傛墍璋撳師瀛愭€э紝绠€鍗曠殑璇村氨鏄竴涓搷浣滆涔堜笉鍋氾紝瑕佷箞鍏ㄩ儴鍋氾紝鑰屽叏閮ㄥ仛灏辨槸鍦ㄦ搷浣滆繃绋嬩腑涓嶈兘琚墦鏂€備緥濡傦紝鍙橀噺鏁版嵁鍔犱竴鐨勬搷浣滄湁浠ヤ笅涓変釜姝ラ锛氫粠鍐呭瓨鍔犺浇鍒板瘎瀛樺櫒銆傚皢鏁版嵁鐨勫€煎鍔?銆傚皢寰楀埌鐨勭粨鏋滃啓鍥炲唴瀛樸€傚師瀛愭€ф槸鎸囦竴涓嚎绋嬪湪鎵ц鍔犳硶杩愮畻鏃朵笉鑳借鍏朵粬绾跨▼鎵撴柇銆傚彧鏈夋湰绾跨▼瀹屾垚杩欎笁涓繃绋嬶紝鍏朵粬绾跨▼鎵嶈兘瀵规暟鎹繘琛屾搷浣溿€傜幇鍦ㄥ氨鐢ㄤ唬鐮佹潵浣撻獙涓€涓嬪惂銆傚湪Java涓紝鎴戜滑鍙互浣跨敤AtomicInteger瀵规暣鍨嬫暟鎹繘琛屽師瀛愭搷浣滐細importjava.util.concurrent.atomic.AtomicInteger;鍏叡绫籄tomicDemo{publicstaticvoidmain(String[]args)throwsInterruptedException{AtomicIntegerdata=newAtomicInteger();鏁版嵁闆嗭紙0锛夛紱//灏嗘暟鎹垵濮嬪寲涓?Threadt1=newThread(()->{for(inti=0;i<100000;i++){data.addAndGet(1);//鍘熷瓙鍦板悜鏁版嵁鍔?}});Threadt2=newThread(()->{for(inti=0;i<100000;i++){data.addAndGet(1);//鏁版嵁鍘熷瓙鍔?}});//鍚姩涓や釜绾跨▼t1.start();t2.寮€濮嬶紙锛夛紱//绛夊緟涓や釜绾跨▼瀹屾垚t1.join();t2.join();//鎵撳嵃鏈€缁堢粨鏋淪ystem.out.println(data);//200000}}浠庝笂闈㈢殑浠g爜鍒嗘瀽鎴戜滑鍙互鐭ラ亾锛屽鏋滄槸涓€涓竴鑸殑鏁村瀷鍙橀噺锛屼袱涓嚎绋嬪悓鏃舵搷浣滐紝鏈€鍚庣殑缁撴灉浼氬皬浜?00000銆傜幇鍦ㄦ垜浠潵妯℃嫙涓€涓棶棰樼殑杩囩▼涓€鑸暣鍨嬪彉閲忥細涓诲瓨涓璬ata鐨勫垵鍊肩瓑浜?锛屼袱涓嚎绋嬪緱鍒扮殑data鍒濆€奸兘绛変簬0銆傜幇鍦ㄧ嚎绋?缁檇ata鍔?锛岀劧鍚庣嚎绋?鍚屾鐨勫€兼暟鎹繑鍥炲埌涓诲瓨鍌ㄥ櫒銆傛暣涓唴瀛樹腑鐨勬暟鎹彉鍖栧涓嬶細鐜板湪绾跨▼2缁檇ata鍔?锛岀劧鍚庢妸data鐨勫€煎悓姝ュ洖涓诲瓨锛堜富瀛樺師鏉ョ殑鍊艰瑕嗙洊锛夛細鎴戜滑鏈潵鎯虫妸data鐨勫€肩粡杩囦笂闈㈢殑鏀瑰姩鍚庡彉鎴愪簡2锛屼絾鏄嚎绋?瑕嗙洊浜嗘垜浠殑鍊硷紝鎵€浠ュ湪澶氱嚎绋嬬殑鎯呭喌涓嬶紝鎴戜滑鏈€鍚庣殑缁撴灉浼氭洿灏忋€備絾鏄湪涓婇潰鐨勭▼搴忎腑锛屾垜浠渶缁堢殑杈撳嚭鏄瓑浜?0000銆傝繖鏄洜涓哄鏁版嵁+1鐨勬搷浣滄槸鍘熷瓙鐨勶紝涓嶅彲鍒嗗壊鐨勶紝鍦ㄦ搷浣滆繃绋嬩腑鍏朵粬绾跨▼涓嶈兘瀵规暟鎹繘琛屾搷浣溿€傝繖灏辨槸鍘熷瓙鎬х殑浼樺娍銆傚叾瀹炰笂闈㈢殑+1鍘熷瓙鎿嶄綔灏辨槸閫氳繃鑷棆閿佸疄鐜扮殑銆傛垜浠彲浠ョ湅涓€涓婣tomicInteger鐨勬簮鐮侊細publicfinalintaddAndGet(intdelta){//AtomicInteger鍐呴儴鏈変竴涓暣鍨嬫暟鎹€硷紝鐢ㄤ簬瀛樺偍鍏蜂綋鐨凬umeric//杩欎釜valueOffset琛ㄧず鏁版嵁鍊煎湪瀵硅薄涓璽his(涔熷氨鏄疉tomicInteger鐨勫叿浣撳璞?//閲岄潰鐨勫唴瀛樺亸绉诲湴鍧€//delta灏辨槸鎴戜滑瑕佸姞鐨勫€紇alue杩欓噷鍔?returnunsafe.getAndAddInt(this,valueOffset,delta)+delta;}浠ヤ笂浠g爜鏈€缁堟槸閫氳繃璋冪敤UnSafe绫荤殑鏂规硶鏉ュ疄鐜扮殑銆傛垜浠潵鐪嬬湅瀹冪殑婧愮爜锛歱ublicfinalintgetAndAddInt(Objecto,longoffset,intdelta){intv;鍋歿v=getIntVolatile(o,offset);//浠庡璞鍦╫ffset澶勭殑鍋忕Щ鍦板潃鑾峰彇鏁版嵁鍊硷紝涔熷氨鏄墠闈㈡彁鍒扮殑瀛樺偍鏁存暟鏁版嵁鐨勫彉閲弣while(!compareAndSwapInt(o,offset,v,v+delta));returnv;}涓婇潰浠g爜鐨勪富瑕佽繃绋嬫槸涓嶆柇浠庡唴瀛樹腑鍙栧嚭瀵硅薄涓亸绉诲湴鍧€涓簅ffset鐨勬暟鎹紝鐒跺悗鎵ц璇彞!compareAndSwapInt(o,offset,v,v+delta)main鍑芥暟杩欐潯璇彞鐨勪綔鐢ㄦ槸锛氭瘮杈冨唴瀛樺亸绉诲湴鍧€涓簅ffset鐨勬暟鎹槸鍚︾瓑浜巚锛屽鏋滅瓑浜巚锛屽垯灏嗗亸绉诲湴鍧€涓簅ffset鐨勬暟鎹缃负v+delta锛屽鏋滆繖鏉¤鍙ユ墽琛屾垚鍔燂紝瀹冭繑鍥炵湡锛屽惁鍒欒繑鍥炲亣銆傝繖灏辨槸鎴戜滑鍦↗ava涓父璇寸殑CAS銆傜湅鍒拌繖閲岋紝浣犲簲璇ュ凡缁忓彂鐜帮紝褰撲笂闈㈢殑璇彞娌℃湁鎵ц鎴愬姛鏃讹紝while寰幆鎿嶄綔浼氫竴鐩寸户缁笅鍘伙紝鐩村埌鎿嶄綔鎴愬姛鎵嶉€€鍑簑hile寰幆銆傚鏋滄搷浣滀笉鎴愬姛锛屽氨浼氫竴鐩村湪杩欓噷鈥滆嚜鏃嬧€濓紝鍍忚繖鏍风殑鎿嶄綔灏辨槸鑷棆锛岃繖绉嶈嚜鏃嬫柟寮忓舰鎴愮殑閿侌煍掑氨鍙仛鑷棆閿併€傚璞$殑鍐呭瓨甯冨眬鍦↗VM涓€侸ava瀵硅薄鐨勫唴瀛樹富瑕佹湁涓夊潡锛氬璞″ご锛屽寘鍚袱閮ㄥ垎鏁版嵁锛屽垎鍒槸Mark瀛楀拰绫诲瀷鎸囬拡锛圞class鎸囬拡锛夈€傚疄渚嬫暟鎹氨鏄垜浠湪绫讳腑瀹氫箟鐨勫悇绉嶆暟鎹€傚榻愬~鍏咃紝JVM鍦ㄥ疄鐜扮殑鏃跺€欒姹傛瘡涓璞″崰鐢ㄧ殑鍐呭瓨澶у皬闇€瑕佹槸8瀛楄妭鐨勬暣鏁板€嶃€傚鏋滀竴涓璞$殑鏁版嵁鍗犵敤鐨勫唴瀛樺ぇ灏忎笉鏄?瀛楄妭鐨勬暣鏁板€嶏紝灏遍渶瑕佸~鍏咃紝鏈€澶氬~鍏?瀛楄妭锛屾瘮濡備竴涓璞℃槸60瀛楄妭锛屾渶缁堜細濉厖鍒?4瀛楄妭銆備笌鎴戜滑瑕佽鐨勫悓姝ラ攣鍗囩骇鍘熺悊瀵嗗垏鐩稿叧鐨勬槸Markword銆傝瀛楁涓昏鐢ㄤ簬瀛樺偍瀵硅薄鐨勮繍琛屾椂鏁版嵁锛屼緥濡傚璞$殑hashcode銆丟C鐨勫垎浠e勾榫勩€佹寔鏈夐攣鐨勭嚎绋嬬瓑銆侹class鎸囬拡涓昏鐢ㄦ潵鎸囧悜瀵硅薄鐨勭被锛屼富瑕佹槸琛ㄧず瀵硅薄灞炰簬鍝釜绫伙紝鏌ユ壘绫荤殑鍏冩暟鎹€傚湪32浣岼ava铏氭嫙鏈轰腑锛孧ark瀛楁湁4涓瓧鑺傦紝鍏?2浣嶏紝鍏跺唴瀹瑰涓嬶細褰撴垜浠娇鐢╯ynchronized鏃讹紝濡傛灉鎴戜滑鍦ㄥ悓姝ヤ唬鐮佸潡涓娇鐢╯ynchronized锛屽氨闇€瑕佷竴涓攣瀵硅薄銆傚浜庤繖涓攣瀵硅薄锛屽綋娌℃湁绾跨▼鎵ц鍒版渶寮€濮嬬殑鍚屾浠g爜鍧楁椂锛?涓瓧鑺傜殑鍐呭濡備笂鍥炬墍绀猴紝鍏朵腑25浣嶇敤鏉ュ瓨鏀緃ash鍊硷紝4浣嶇敤鏉ュ瓨鏀緂arbagecollectionGenerationalage锛堜笉鐭ラ亾鐨勫彲浠ヨ烦杩囷級锛屽墿涓嬬殑涓変綅锛岀涓€浣嶇敤鏉ヨ〃绀哄綋鍓嶉攣鐘舵€佹槸鍚︽槸鍋忓悜閿侊紝鏈€鍚庝袱浣嶈〃绀烘槸鍝釜鐘舵€乧urrentlockisin:if鏈€鍚庝笁浣嶄负锛?01锛岃〃绀洪攣鐘舵€佷负鏃犻攣銆傚鏋滃悗涓変綅鏄細101锛屽垯琛ㄧず閿佺姸鎬佷负鍋忓悜閿併€傚鏋滄渶鍚庝袱浣嶆槸锛?0锛屽垯琛ㄧず璇ラ攣鐘舵€佷负杞婚噺绾ч攣銆傚鏋滄渶鍚庝袱浣嶆槸锛?0锛岃鏄庨攣鐘舵€佹槸閲嶉噺绾ч攣銆傚悓姝ラ攣鐨勫崌绾ч『搴忔槸锛氭棤馃敀->鏈夊亸馃敀->杞婚噺绾ю煍?>閲嶉噺绾ю煍掋€侸ava涓湁涓€涓狫VM鍙傛暟鐢ㄦ潵璁剧疆JVM鍚姩澶氬皯绉掑悗寮€鍚亸鍚戦攣锛圝DK6浠ュ悗榛樿寮€鍚亸鍚戦攣锛孞VM榛樿鍚姩鍚?绉掑紑鍚璞″亸鍚戦攣.杩欎釜寤惰繜鏃堕棿鍙仛鍋忓悜寤惰繜锛屽彲浠ラ€氳繃涓嬮潰鐨勫弬鏁版潵鎺у埗)锛?/璁剧疆鍋忓悜寤惰繜鏃堕棿锛岃繖涓椂闂村悗鍙湁瀵硅薄閿佹墠浼氭湁鍋忓悜閿佺姸鎬?XX:BiasedLockingStartupDelay=4//绂佹鍋忓悜閿?XX:-UseBiasedLocking//鍚敤鍋忓悜閿?XX:+UseBiasedLocking鎴戜滑鍙互閫氳繃浠g爜楠岃瘉瑙i攣鐘舵€佷笅MarkWord鐨勫唴瀹规槸浠€涔堬細importorg.openjdk.jol.info.ClassLayout;瀵煎叆java.util.concurrent.TimeUnit锛沺ublicclassMarkWord{publicObjecto=newObject();publicsynchronizedvoiddemo(){synchronized(o){System.out.println("insidesynchronizedcodeblock");System.out.println(ClassLayout.parseInstance(o).toPrintable());}}publicstaticvoidmain(String[]args)throwsInterruptedException{System.out.println("绛夊緟4s涔嬪墠");System.out.println(ClassLayout.parseInstance(newObject()).toPrintable());TimeUnit.SECONDS.sleep(4);MarkWordmarkWord=newMarkWord();System.out.println("绛夊緟4s鍚?);System.out.println(ClassLayout.parseInstance(newObject()).toPrintable());鑻忔皑閰竐adthread=newThread(markWord::demo);thread.start();绾跨▼.join();System.out.println(ClassLayout.parseInstance(markWord.o).toPrintable());}}涓婇潰浠g爜鐨勮緭鍑猴紝涓嬮潰绾㈡琛ㄧず鏄惁鏄亸鍚戦攣鍜岄攣鏍囧織锛堝ぇ瀹跺彲鑳戒細濂囨€负浠€涔堟槸杩欎釜浣嶇疆锛屾渶鍚?浣嶄笉搴旇琛ㄧず閿佺浉鍏崇殑鐘舵€佸悧锛熻繖鏄叾瀹炲氨鏄暟鎹〃绀虹殑澶у皬绔棶棰橈紝鏈夊叴瓒g殑鍙互鍘荤湅鐪嬶紝杩欓噷浣犲彧闇€瑕佺煡閬撶孩妗嗗唴鐨勪笁涓綅鏄敤鏉ヨ〃绀烘槸鍚︽槸鍋忓悜閿佸拰flagbitofthelock)锛氫粠涓婂浘鎴戜滑鍙互鍒嗘瀽鍑哄湪鍋忓悜寤惰繜涔嬪墠锛屽璞¢攣鐨勭姸鎬佷笉浼氭湁鍋忓悜閿侊紝鎵€浠ュ璞″ご涓璏arkword涓殑閿佺姸鎬佷负01锛岃€屽亸鍚戦攣鐘舵€佷负0锛岃〃绀烘鏃跺浜庤В閿佺姸鎬侊紝浣?绉掑悗鍋忓悜閿佺姸鎬佸彉涓?锛屾墍浠ュ綋鍓嶉攣鐘舵€佷负鍋忓悜閿侊紝浣嗕笉鏄嚎绋嬫嫢鏈夊畠銆傝繖绉嶇姸鎬佷篃鍙尶鍚嶅亸鍚戯紝鍥犱负涓婇潰浠g爜涓彧鏈変竴涓嚎绋嬭繘鍏ヤ簡synchronized鍚屾浠g爜鍧楋紝鎵€浠ュ彲浠ヤ娇鐢ㄥ亸鍚戦攣锛屾墍浠ynchronized浠g爜鍧椾腑鎵撳嵃鐨勫璞$殑閿佺姸鎬佷篃鏄亸鍚戦攣銆備笂闈㈢殑浠g爜浣跨敤浜唈ol鍖呫€備綘闇€瑕佸湪浣犵殑pom鏂囦欢涓紩鍏ョ浉搴旂殑鍖咃細org.openjdk.joljol-core0.10鐨勪笂鍥炬垜浠睍绀虹殑缁撴灉鏄湪64浣嶆満鍣ㄤ笅灞曠ず鐨勭粨鏋滐紝64浣嶆満鍣ㄤ腑Java瀵硅薄澶翠腑MarkWord鍜孠lcassPointer鐨勫唴瀛樺竷灞€濡備笅锛歁arkWord鍗?瀛楄妭锛孠classPointer鍗?瀛楄妭銆侸VM鍦?4浣嶅拰32浣嶆満鍣ㄤ笂鐨凪arkWord鍐呭鍩烘湰涓€鑷淬€侻arkWord鍦?4浣嶆満鍜?2浣嶆満涓婄殑鍐呭鍜屽惈涔夋槸涓€鏍风殑銆傛墍浠ュ悗涓変綅鐨勫惈涔夊彲浠ュ弬鑰?2浣岼VM鐨凪arkWord銆傞攣鐨勫崌绾ц繃绋嬪亸鍚戜簬閿併€傚鏋滀綘鍐欑殑synchronized浠g爜鍧楁病鏈夊绾跨▼鎵ц锛岃€屾槸鍙湁涓€涓嚎绋嬫墽琛岋紝杩欑閿佷細澶уぇ鎻愰珮绋嬪簭鐨勬€ц兘銆備粬鐨勫叿浣撳仛娉曟槸JVM浼氬皢瀵硅薄澶翠腑琛ㄧず鏄惁涓哄亸鍚戦攣鐨勭涓変綅璁剧疆涓?锛屽悓鏃朵娇鐢–AS鎿嶄綔灏嗙嚎绋嬬殑ID璁板綍鍦∕arkWord涓€傚鏋滄搷浣滄垚鍔燂紝灏辩浉褰撲簬Get馃敀锛岄偅涔堜笅娆$嚎绋嬭杩涘叆涓寸晫鍖烘椂锛屽彧闇€瑕佹瘮杈冪嚎绋婭D鏄惁鐩稿悓锛岃€屼笉鐢ㄨ繘琛孋AS鎴栧姞閿佺瓑浠d环楂樻槀鐨勬搷浣滐紝瀹冨彧闇€瑕佽繘琛岀畝鍗曠殑姣旇緝銆傚湪杩欑鎯呭喌涓嬮攣瀹氱殑寮€閿€闈炲父灏忋€備綘鍙兘鏈変竴涓棶棰樸€傚湪鏃犻攣鐘舵€佷笅锛孧arkWord瀛樺偍鐨勬槸鍝堝笇鍊硷紝鑰屽湪鍋忓悜閿佺姸鎬佷笅锛屽畠瀛樺偍鐨勬槸绾跨▼ID銆傞偅涔堜箣鍓嶅瓨鍌ㄧ殑HashCode灏辨病鏈変簡锛佷綘鍙兘浼氭兂锛屾病鏈夊氨娌℃湁锛岃繕鍙互鍐嶇畻涓€閬嶏紒浜嬪疄涓婏紝鎯呭喌骞堕潪濡傛銆傚鏋滄垜浠绠梙ash鍊硷紝鎴戜滑闇€瑕佸敖鍙兘鐨勪繚鎸乭ash鍊硷紙浣嗚繖鍦↗ava涓笉鏄己鍒剁殑锛屽洜涓篽ashCode鏂规硶鍦↗ava涓槸鍙互閲嶅啓鐨勶級锛屾墍浠ュ湪Java涓紝涓轰簡淇濇寔hash鍊肩殑涓嶅彉鎬ash鍊间細绗竴娆¤绠椾竴鑷寸殑hash鍊硷紙MarkWord涓瓨鍌ㄧ殑涓€鑷磆ash鍊间笉鏄寚閲嶅啓鐨刪ashCode杩斿洖鍊硷紝Java涓彲浠ラ€氳繃Object.hashCode()鎴栬€匰ystem.identityHashCode(Object)鏂规硶璁$畻鍑轰竴涓竴鑷存€у搱甯屽€硷級锛屽皢璁$畻鍑虹殑涓€鑷存€у搱甯屽€煎瓨鍌ㄥ湪MarkWord涓紝涓嬫鏈夎姹備竴鑷存€у搱甯屽€肩殑鏃跺€欏瓨鍌ㄤ笅闈㈢殑涓€鑷存€у搱甯屽€硷紝杩欐牱灏卞緱鍒颁簡涓€鑷存€у搱甯屽€兼瘡娆¤绠楅兘鍙互淇濊瘉鐩稿悓銆備絾鏄綋鎴愪负鍋忓悜閿佹椂锛岀嚎绋婭D浼氳鐢ㄦ潵瑕嗙洊hash鍊硷紝鎵€浠ヤ竴涓璞¤绠楀嚭涓€鑷寸殑hash鍊煎悗锛屽氨涓嶈兘鍐嶅浜庡亸鍚戦攣鐘舵€侊紝鑰屽綋涓€涓璞″浜庡亸鍚戞椂lockstate鏃讹紝褰撴敹鍒拌姹備竴鑷存€у搱甯屽€肩殑璇锋眰鏃讹紝鍗宠皟鐢ㄤ笂闈㈡彁鍒扮殑涓や釜鏂规硶锛屽亸鍚戦攣浼氱珛鍗冲睍寮€涓洪噸閲忕骇閿侊紝鐒跺悗灏哅arkWord瀛樻斁鍦ㄩ噸閲忕骇涓攣銆備笅闈唬鐮佹槸楠岃瘉鍦ㄥ亸鍚戦攣鐘舵€佷笅璋冪敤System.identityHashCode鍑芥暟鏃讹紝閿佺姸鎬佷細鍗囩骇涓洪噸閲忕骇閿侊細importorg.openjdk.jol.info.ClassLayout;importjava.util.concurrent銆俆imeUnit;publicclassMarkWord{publicObjecto=newObject();publicsynchronizedvoiddemo(){System.out.println("鍦⊿ystem.identityHashCode(o)鍑芥暟涔嬪墠");System.out.println(ClassLayout.parseInstance(o).toPrintable());鍚屾(o){System.identityHashCode(o);System.out.println("鍦⊿ystem.identityHashCode(o)鍑芥暟涔嬪悗");System.out.println(ClassLayout.parseInstance(o).toPrintable());}}publicstaticvoidmain(String[]args)throwsInterruptedException{TimeUnit.SECONDS.sleep(5);MarkWordmarkWord=newMarkWord();绾跨▼thread=newThread(markWord::demo);绾跨▼.寮€濮?);绾跨▼.join();TimeUnit.SECONDS.sleep(2);System.out.println(ClassLayout.parseInstance(markWord.o).toPrintable());}}杞婚噺閿佽交閲忛攣涔熷湪JDK1涓€?琛ュ厖锛屽綋涓€涓嚎绋嬭幏鍙栧亸鍚戦攣鏃讹紝褰撳彟涓€涓嚎绋嬪姞鍏ラ攣绔炰簤鏃讹紝姝ゆ椂浼氫粠鍋忓悜閿佸崌绾т负杞婚噺绾у綋绾у埆閿佸浜庤交閲忕骇閿佺姸鎬佹椂锛岃櫄鎷熸満浼氬厛鍦ㄥ綋鍓嶇嚎绋嬬殑鏍堝抚涓垱寤轰竴涓攣璁板綍锛圠ockRecord锛夋潵瀛樻斁瀵硅薄MarkWord鐨勫壇鏈紝瀹樻柟绉颁箣涓篋isplacedMarkWord銆傜劧鍚庤櫄鎷熸満閫氳繃CAS鎿嶄綔灏濊瘯灏嗗璞$殑MarkWord鎸囧悜鏍堜腑鐨凩ockRecord銆傚鏋滄搷浣滄垚鍔燂紝鍒欒〃绀鸿绾跨▼宸茬粡鑾峰緱浜嗛攣锛屽彲浠ヨ繘鍏ュ悓姝ヤ唬鐮佸潡鎵ц銆傚惁鍒欒鏄庨攣瀵硅薄宸茬粡琚叾浠栫嚎绋嬪崰鐢紝绾跨▼闇€瑕佷娇鐢–AS涓嶆柇鑾峰彇閿併€傚綋鐒讹紝浣犲彲鑳戒細鏈夌枒鎯戯紝绾跨▼鏄笉鏄簲璇ヤ竴鐩存寰幆锛熻繖瀵笴PU鏉ヨ鏄笉鏄お璐典簡锛熺‘瀹炲姝ゃ€傚洜姝わ紝褰揅AS婊¤冻涓€瀹氭潯浠舵椂锛岃交閲忕骇閿佸氨浼氬崌绾т负閲嶉噺绾ч攣銆傚叿浣撹繃绋嬪湪閲嶉噺绾ч攣绔犺妭鍒嗘瀽銆傚綋绾跨▼闇€瑕佷粠鍚屾浠g爜鍧椾腑鍑烘潵鏃讹紝绾跨▼杩橀渶瑕佷娇鐢–AS灏咲isplacedMarkWord鏇挎崲鍥炲璞$殑MarkWord銆傚鏋滄浛鎹㈡垚鍔燂紝鍒欏悓姝ヨ繃绋嬪畬鎴愩€傚鏋滄浛鎹㈠け璐ワ紝鍒欐剰鍛崇潃鍏朵粬绾跨▼姝e湪灏濊瘯鑾峰彇閿侊紝閿佸崌绾т负閲嶉噺绾ч攣銆備箣鍓嶇珵浜夐攣鐨勭嚎绋嬪凡缁忚鎸傝捣锛屾墍浠ョ嚎绋嬪湪閲婃斁閿佺殑鍚屾椂闇€瑕佸敜閱掕鎸傝捣鐨勭嚎绋嬨€傞噸閲忕骇閿佹墍璋撻噸閲忕骇閿佹槸鏈€鏄傝吹鐨勯攣瀹氭満鍒躲€傚湪杩欑鎯呭喌涓嬶紝鎿嶄綔绯荤粺闇€瑕佹寕璧疯繕娌℃湁杩涘叆鍚屾浠g爜鍧楃殑绾跨▼銆侸VM搴曞眰锛圠inux鎿嶄綔绯荤粺涓嬶級浣跨敤pthread_mutex_lock銆乸thread_mutex_unlock銆乸thread_cond_wait銆乸thread_cond_signal鍜宲thread_cond_broadcast鏄嚑涓簱鍑芥暟瀹炵幇鐨勶紝鑰岃繖浜涘嚱鏁颁緷璧栦簬futex绯荤粺璋冪敤锛屾墍浠ュ湪浣跨敤閲嶉噺绾ч攣鏃讹紝鐢变簬绯荤粺璋冪敤锛岃繘绋嬮渶瑕佷粠鐢ㄦ埛鎬佸垏鎹㈠埌鍐呮牳鎬佹寕璧风嚎绋嬶紝鍐嶄粠鍐呮牳鎬佸垏鎹㈠埌鐢ㄦ埛鎬侊紝瑙i攣鏃堕渶瑕佷粠鐢ㄦ埛鎬佸垏鎹㈠埌鍐呮牳鎬佸敜閱掔嚎绋嬬嚎銆傚綋涓や釜鎴栧涓嚎绋嬬珵浜夊悓涓€涓交閲忕骇閿佹椂锛岃交閲忕骇閿佷笉鍐嶆湁鏁堬紙鍗囩骇杞婚噺绾ч攣鐨勬潯浠讹級銆傛鏃堕攣鎵╁睍涓洪噸閲忕骇閿侊紝閿佺殑鏍囧織鐘舵€佸鏋滃彉涓?0锛屽垯鎸囧悜閲嶉噺绾ч攣鐨勬寚閽堝瓨鍌ㄥ湪MarkWord涓紝绋嶅悗绛夊緟閿佺殑绾跨▼灏嗚鎸傝捣銆傚洜涓烘鏃禡arkWord宸茬粡瀛樺偍鍦ㄦ寚鍚戦噸閲忕骇閿佺殑鎸囬拡涓紝鎵€浠ュ湪杞婚噺绾ч攣鐨勬儏鍐典笅杩涘叆鍚屾浠g爜鍧楁椂锛屼娇鐢–AS灏咲isplacedMarkWord鏇挎崲鍥炲璞$殑MarkWord鍚屾浠g爜鍧楄閲婃斁鏇挎崲灏嗗け璐ャ€備笂闈㈣杩囷紝鍦ㄥけ璐ョ殑鎯呭喌涓嬶紝绾跨▼闇€瑕佸湪閲婃斁閿佺殑鍚屾椂鍞ら啋鎸傝捣鐨勭嚎绋嬨€傛€荤粨鍦ㄨ繖绡囨枃绔犱腑锛屾垜浠富瑕佷粙缁嶄簡鍚屾鍐呴攣鍗囩骇鐨勫師鐞嗐€傚叿浣撶殑閿佸崌绾ц繃绋嬫槸锛氭棤馃敀->鍋忓悜馃敀->鈥嬧€嬭交閲忕骇馃敀->閲嶉噺绾ю煍掋€傛棤閿侊細杩欐槸娌℃湁鍚敤鍋忓悜閿佹椂鐨勭姸鎬併€侸DK1.6涔嬪悗榛樿寮€鍚亸鍚戦攣锛屼絾鏄湁鍋忓悜寤惰繜銆侸VM寮€濮嬫墦寮€鍚庨渶瑕佸灏戠銆傝繖鍙互閫氳繃JVM鍙傛暟鏉ュ畬鎴愩€傚悓鏃朵篃鍙互閫氳繃JVM鍙傛暟璁剧疆鏄惁寮€鍚亸鍚戦攣銆傚亸鍚戦攣锛氳繖鏄亸鍚戦攣鎵撳紑鍚庨攣鐨勭姸鎬併€傚鏋滄病鏈夌嚎绋嬭幏寰楅攣锛岃繖绉嶇姸鎬佺О涓哄尶鍚嶅亸鍚戙€傚綋涓€涓嚎绋嬭幏寰椾簡鍋忓悜閿佸悗锛屼笅娆¤绔炰簤閿佹椂锛屽彧闇€瑕佸皢绾跨▼ID涓嶮arkWord涓瓨鍌ㄧ殑绾跨▼ID杩涜姣旇緝鍗冲彲銆傚鏋滅嚎绋婭D鐩稿悓锛屽垯鐩存帴鑾峰彇閿侊紙鐩稿綋浜庨攣鍋忓悜鏈嚎绋嬶級銆備笉闇€瑕佹墽琛孋AS鎿嶄綔鍜屾寕璧风嚎绋嬨€傝交閲忕骇閿侊細鍦ㄨ繖绉嶇姸鎬佷笅锛岀嚎绋嬩富瑕佹槸閫氳繃CAS鎿嶄綔鏉ュ疄鐜扮殑銆傚皢瀵硅薄鐨凪arkWord瀛樺偍鍦ㄧ嚎绋嬬殑铏氭嫙鏈烘爤涓紝鐒跺悗閫氳繃CAS灏嗗璞$殑MarkWord鐨勫唴瀹硅缃负鎸囧悜DisplacedMarkWord鐨勬寚閽堬紝璁剧疆鎴愬姛鍒欒幏鍙栭攣銆傚綋绾跨▼閫€鍑轰复鐣屽尯鏃讹紝涔熼渶瑕佷娇鐢–AS銆傚鏋淐AS鏇挎崲鎴愬姛锛屽垯鍚屾鎴愬姛銆傚鏋滃け璐ワ紝璇存槑鏈夊叾浠栫嚎绋嬫鍦ㄨ幏鍙栭攣锛屾墍浠ラ渶瑕佸湪閲婃斁閿佸悗鍞ら啋鎸傝捣鐨勭嚎绋嬨€傞噸閲忕骇閿侊細褰撴湁涓や釜浠ヤ笂绾跨▼鑾峰彇閿佹椂锛岃交閲忕骇閿佷細鍗囩骇涓洪噸閲忕骇閿侊紝鍥犱负濡傛灉CAS涓嶆垚鍔燂紝浼氫竴鐩磋嚜鏃嬫墽琛寃hile寰幆鎿嶄綔锛屾秷鑰桟PU杈冨锛屼絾鏄崌绾т负閲嶉噺绾ч攣鍚庯紝绾跨▼浼氳鎿嶄綔绯荤粺璋冨害锛岀劧鍚庢寕璧凤紝鍙互鑺傜渷CPU璧勬簮銆備互涓婂氨鏄湰鏂囩殑鍏ㄩ儴鍐呭锛屾垜鏄疞eHung锛屾垜浠笅鏈熷啀瑙侊紒锛侊紒鏇村绮惧僵鍐呭鍚堥泦鍙互璁块棶椤圭洰锛歨ttps://github.com/Chang-LeHu...鍏虫敞鍏紬鍙凤細涓€涓病鐢ㄧ殑鐮旂┒鍍э紝瀛︿範鏇村璁$畻鏈虹煡璇嗭紙Java锛孭ython锛岃绠楁満绯荤粺鍩虹锛岀畻娉曞拰鏁版嵁缁撴瀯锛夌煡璇嗐€?/p>

最新推荐
猜你喜欢