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鏂囦欢涓紩鍏ョ浉搴旂殑鍖咃細
