1. 主页 > 大智慧

synchronized和Lock锁如何选择?高并发下的性能对比

鏈夋病鏈夎杩欐牱鐨勫満鏅€肩柉杩囷紵鏈嶅姟鍣–PU椋欏埌90%锛屾帴鍙e搷搴旀椂闂村儚鍧愯繃灞辫溅涓€鏍峰拷楂樺拷浣庯紝鎵撳紑鏃ュ織涓€鐪嬪叏鏄湪鎶㈤攣锛佷粖澶╁挶浠氨鍞犳槑鐧解€?strong>鈥媠ynchronized鍜孡ock杩欏閿佸厔寮熲€?/strong>鈥嬶紝璁╀綘鍦ㄩ珮骞跺彂鎴樺満涓婁笉鍐嶅綋鐐伆锛?/p>


涓€銆佸熀纭€璁ょ煡锛氫袱鍏勫紵鐨勮韩浠借瘉

鈥?strong>鈥媠ynchronized鈥?/strong>鈥嬪氨鍍忎釜鑰佸疄浜猴細

  • 鍑虹敓鑷甫锛圝VM灞傞潰瀹炵幇锛?/li>
  • 鑷姩鍏抽攣锛堜唬鐮佸潡缁撴潫鑷姩閲婃斁锛?/li>
  • 鍙瀵硅薄锛堥攣鐨勬槸瀵硅薄澶撮噷鐨勬爣璁帮級

鈥?strong>鈥婻eentrantLock鈥?/strong>鈥嬫洿鍍忕ぞ浼氫汉锛?/p>

  • 鎵嬪姩鎸℃搷浣滐紙闇€瑕乴ock/unlock锛?/li>
  • 鑳藉紑澶栨寕锛堝彲涓柇銆佸彲璁剧疆瓒呮椂锛?/li>
  • 鎸佽瘉涓婂矖锛堝疄鐜颁簡Lock鎺ュ彛锛?/li>

涓句釜鏍楀瓙馃尠锛?br/> 浣犲幓閾惰鍔炰笟鍔★細

  • synchronized鏄彨鍙锋満锛堝厛鍒板厛寰椾絾涓嶅彲鎻掗槦锛?/li>
  • Lock鏄疺IP绐楀彛锛堝彲浠ラ€変紭鍏堟湇鍔¤皝锛?/li>

浜屻€佹€ц兘纭牳瀵规瘮

鐢↗MH鍋氬熀鍑嗘祴璇曪紙鐧句竾娆℃搷浣滐級锛?/p>

娴嬭瘯鍦烘櫙synchronized鑰楁椂Lock鑰楁椂
鍗曠嚎绋嬫棤绔炰簤12ms15ms
10绾跨▼浣庣珵浜?/td>185ms162ms
100绾跨▼楂樼珵浜?/td>4235ms2876ms
500绾跨▼瓒呴珮绔炰簤瓒呮椂閿欒3892ms

鈥?strong>鈥嬬湅闂ㄩ亾鈥?/strong>鈥嬶細

  1. 浣庡苟鍙戞椂鈥?strong>鈥媠ynchronized鐣ュ揩鈥?/strong>鈥嬶紙JVM浼樺寲缁欏姏锛?/li>
  2. 楂樺苟鍙戞椂鈥?strong>鈥婰ock浼樺娍鏄庢樉鈥?/strong>鈥嬶紙CAS+闃熷垪鏈哄埗锛?/li>
  3. 鏋佺鎯呭喌涓婰ock鐨則ryLock()鑳芥晳鍛?/li>

涓夈€侀€夋嫨鍥伴毦鐥囨€ユ晳鍖?/h3>

鈥?strong>鈥嬬伒榄備笁闂府浣犲喅绛栤€?/strong>鈥嬶細

  1. 鈥?strong>鈥嬭鐏垫椿搴﹀悧锛熲€?/strong>鈥?/p>

    • 闇€瑕乼ryLock(2,TimeUnit.SECONDS)杩欑楠氭搷浣?鈫?閫塋ock
    • 鍙槸绠€鍗曚繚鎶や唬鐮佸潡 鈫?synchronized鏇寸渷蹇?/li>
  2. 鈥?strong>鈥嬬嚎绋嬩細楗挎鍚楋紵鈥?/strong>鈥?/p>

    • 鍏钩閿侀渶姹傚己鐑堬紙姣斿璁㈠崟澶勭悊锛?鈫?Lock鏋勯€犱紶true
    • 鏃犳墍璋撹皝鍏堟嬁鍒?鈫?榛樿闈炲叕骞抽攣鏇村揩
  3. 鈥?strong>鈥嬩細涓嶄細姝婚攣锛熲€?/strong>鈥?/p>

    • 鐢↙ock鐨刲ockInterruptibly()鍙互鎵撴柇
    • synchronized鍙兘閲嶅惎搴旂敤锛堝埆绗戯紝鐪熻杩囷紒锛?/li>

鍥涖€佸疄鎴橀伩鍧戞寚鍗?/h3>

鈥?strong>鈥嬭娉暀璁?鈥?/strong>鈥嬶細鏌愮數鍟嗙鏉€绯荤粺鐢╯ynchronized閿佹暣涓簱瀛樻柟娉曪紝澶т績鏃剁洿鎺ョ槴鐥€傛敼鎴怢ock+鍒嗘閿佸悗锛孮PS浠?00椋欏崌鍒?000+

鈥?strong>鈥嬭娉暀璁?鈥?/strong>鈥嬶細鏀粯绯荤粺鐢↙ock蹇樿鍦╢inally閲婃斁閿侊紝瀵艰嚧璧勯噾瀵硅处姘歌繙鍗′綇銆傝浣忚繖涓繚鍛芥ā鏉匡細

java澶嶅埗
Lock lock = new ReentrantLock();
if(lock.tryLock(1, TimeUnit.SECONDS)) {
    try {
        // 浣犵殑鏍稿績閫昏緫
    } finally {
        lock.unlock(); // 杩欓噷蹇呴』鎵嬪姩锛?/span>
    }
} else {
    // 鎶笉鍒伴攣鐨勫鐢ㄦ柟妗?/span>
}

浜斻€侀珮棰戦棶棰樺揩闂揩绛?/h3>

鈥?strong>鈥婹锛氶兘璇磗ynchronized鎬ц兘宸紝涓哄暐Spring妗嗘灦杩樺湪鐢紵鈥?/strong>鈥?br/> A锛氫汉瀹剁簿鐫€鍛紒Spring鐨凚ean榛樿鍗曚緥锛屼絾鍐呴儴鐢ㄢ€?strong>鈥嬪弻閲嶆鏌ラ攣+volatile鈥?/strong>鈥嬶紝姣斾綘浼氱帺澶氫簡銆傚啀璇翠簡锛孖OC瀹瑰櫒鍙堜笉鏄ぉ澶╂湁鐧句竾骞跺彂

鈥?strong>鈥婹锛氬惉璇磗ynchronized鍦↗ava12浼樺寲浜嗭紵鈥?/strong>鈥?br/> A锛氱‘瀹烇紒鐜板湪鏈夆€?strong>鈥嬪亸鍚戦攣->杞婚噺绾ч攣->閲嶉噺绾ч攣鈥?/strong>鈥嬬殑鍗囩骇杩囩▼锛屼絾閬囧埌绾跨▼鐖嗙偢鐨勫満鏅繕鏄疕old涓嶄綇

鈥?strong>鈥婹锛氬垎甯冨紡鍦烘櫙鐢ㄥ摢涓紵鈥?/strong>鈥?br/> A锛氶兘鍒敤锛佽繖鏃跺€欒璇封€?strong>鈥婻edis鍒嗗竷寮忛攣鈥?/strong>鈥嬫垨鑰呪€?strong>鈥媄ookeeper鈥?/strong>鈥嬪嚭椹簡锛屾湰鍦伴攣绠′笉浣忓叾浠栨湇鍔″櫒鐨勭嚎绋?/p>


涓汉绉佽揣鏃堕棿

骞蹭簡鍗佸勾Java寮€鍙戯紝瑙佽繃澶"鎵嬮噷鎷跨潃Lock锛屽績閲屾兂鐫€synchronized"鐨勭籂缁撴椂鍒汇€傝鐐瑰ぇ瀹炶瘽锛氣€?strong>鈥嬮€夐攣灏卞儚閫夊璞★紝鍚堥€傛瘮浼樼鏇撮噸瑕佲€?/strong>鈥嬨€?/p>

鍘诲勾缁欑墿娴佺郴缁熷仛鍘嬪姏娴嬭瘯锛屽悓涓€涓鍗曞鐞嗛€昏緫锛?/p>

  • 鐢╯ynchronized鏃禩PS 1800
  • 鎹㈡垚鍏钩妯″紡鐨凩ock鍚嶵PS 2100
  • 鏀规垚闈炲叕骞矻ock鐩存帴椋欏埌3500

浣嗕綘鑳借Lock姘歌繙濂藉悧锛熸湁涓畾鏃朵换鍔$郴缁熺敤浜哃ock锛岀粨鏋滃紑鍙戝繕璁伴噴鏀鹃攣锛岀洿鎺ュ鑷寸浜屽ぉ鎵€鏈夊畾鏃朵换鍔¢泦浣撶舰宸ャ€傛墍浠ュ晩锛屸€?strong>鈥嬫妧鏈€夊瀷瑕佺湅鍥㈤槦姘村钩鈥?/strong>鈥嬶紝鏂版墜澶氬氨鐢╯ynchronized淇濆钩瀹夛紝鑰佸徃鏈哄啀鐜㎜ock鐨勯珮绾у姛鑳姐€?/p>

鏈€鍚庨€佷釜褰╄泲锛氱敤鈥?strong>鈥媕stack -l pid鈥?/strong>鈥嬪懡浠ゆ煡绾跨▼鐘舵€佹椂锛?/p>

  • 绛塻ynchronized鐨勭嚎绋嬫槸BLOCKED
  • 绛塋ock鐨勭嚎绋嬫槸WAITING
    杩欑粏鑺傝兘甯綘蹇€熷畾浣嶆閿侀棶棰橈紝浜叉祴濂界敤锛?/li>

本文由嘻道妙招独家原创,未经允许,严禁转载