Go璇█atomic鍘熷瓙鎿嶄綔
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go璇█atomic鍘熷瓙鎿嶄綔相关的知识,希望对你有一定的参考价值。
鏍囩锛?a href='http://www.mamicode.com/so/1/%e5%85%b3%e5%bf%83' title='鍏冲績'>鍏冲績
targe 婧愮爜 瑙f瀽 鎺ュ彈 浼樺娍 濂芥枃 鍒涘缓 comatomic鏄渶杞婚噺绾х殑閿?鍦ㄤ竴浜涘満鏅笅鐩存帴浣跨敤atomic鍖呰繕鏄緢鏈夋晥鐨勩€?br> 鏈変簡鈥滃師瀛愮殑鈥濊繖涓舰瀹硅瘝灏辨剰鍛崇潃锛屽湪杩欓噷璇诲彇value鐨勫€肩殑鍚屾椂锛屽綋鍓嶈绠楁満涓殑浠讳綍CPU閮戒笉浼氳繘琛屽叾瀹冪殑閽堝姝ゅ€肩殑璇绘垨鍐欐搷浣溿€?/p>
杩欐牱鐨勭害鏉熸槸鍙楀埌搴曞眰纭欢鐨勬敮鎸佺殑銆?/p>
鍏朵富瑕佸師鍥犳槸锛屽師瀛愭搷浣滅敱搴曞眰纭欢鏀寔锛岃€岄攣鍒欑敱鎿嶄綔绯荤粺鎻愪緵鐨凙PI瀹炵幇銆傝嫢瀹炵幇鐩稿悓鐨勫姛鑳斤紝鍓嶈€呴€氬父浼氭洿鏈夋晥鐜囥€?/strong> 鍏充簬atomic,骞跺彂缂栫▼鐨勪綔鑰呰寰堢粏寰堟竻妤氾紝鍐嶅彲浠ョ湅鐪嬩笅闈袱绡囧ソ鏂囨。:: 杞浇: https://studygolang.com/articles/3557
涓嬮潰鍐呭鎽樼鑷?a href="http://ifeve.com/go-concurrency-atomic/" target="_blank">銆奊O骞跺彂缂栫▼瀹炴垬銆嬧€斺€?鍘熷瓙鎿嶄綔:
CAS鎿嶄綔鐨勪紭鍔挎槸锛屽彲浠ュ湪涓嶅舰鎴愪复鐣屽尯鍜屽垱寤轰簰鏂ラ噺鐨勬儏鍐典笅瀹屾垚骞跺彂瀹夊叏鐨勫€兼浛鎹㈡搷浣溿€?br>杩欏彲浠ュぇ澶х殑鍑忓皯鍚屾瀵圭▼搴忔€ц兘鐨勬崯鑰椼€?
褰撶劧锛孋AS鎿嶄綔涔熸湁鍔e娍銆傚湪琚搷浣滃€艰棰戠箒鍙樻洿鐨勬儏鍐典笅锛孋AS鎿嶄綔骞朵笉閭d箞瀹规槗鎴愬姛銆?br>
鍘熷瓙鎿嶄綔鍏辨湁5绉嶏紝鍗筹細澧炴垨鍑忋€佹瘮杈冨苟浜ゆ崲銆佽浇鍏ャ€佸瓨鍌ㄥ拰浜ゆ崲
1. 澧炴垨鍑?/strong>
琚敤浜庤繘琛屽鎴栧噺鐨勫師瀛愭搷浣滐紙浠ヤ笅绠€绉板師瀛愬/鍑忔搷浣滐級鐨勫嚱鏁板悕绉伴兘浠モ€淎dd鈥濅负鍓嶇紑锛屽苟鍚庤窡閽堝鐨勫叿浣撶被鍨嬬殑鍚嶇О銆?br>涓嶈繃锛岀敱浜巃tomic.AddUint32鍑芥暟鍜宎tomic.AddUint64鍑芥暟鐨勭浜屼釜鍙傛暟鐨勭被鍨嬪垎鍒槸uint32鍜寀int64锛屾墍浠ユ垜浠棤娉曢€氳繃浼犻€掍竴涓礋鐨勬暟鍊兼潵鍑忓皬琚搷浣滃€笺€?br>atomic.AddUint32(&ui32, ^uint32(-NN-1)) 鍏朵腑NN浠h〃浜嗕竴涓礋鏁存暟
2. 姣旇緝骞朵氦鎹?/strong>
func CompareAndSwapInt32(addr *int32, old, new int32) (swapped bool)
绗竴涓弬鏁扮殑鍊煎簲璇ユ槸鎸囧悜琚搷浣滃€肩殑鎸囬拡鍊笺€傝鍊肩殑绫诲瀷鍗充负*int32銆?br>鍚庝袱涓弬鏁扮殑绫诲瀷閮芥槸int32绫诲瀷銆傚畠浠殑鍊煎簲璇ュ垎鍒唬琛ㄨ鎿嶄綔鍊肩殑鏃у€煎拰鏂板€?br>CompareAndSwapInt32鍑芥暟鍦ㄨ璋冪敤涔嬪悗浼氬厛鍒ゆ柇鍙傛暟addr鎸囧悜鐨勮鎿嶄綔鍊间笌鍙傛暟old鐨勫€兼槸鍚︾浉绛夈€?br>浠呭綋姝ゅ垽鏂緱鍒拌偗瀹氱殑缁撴灉涔嬪悗锛岃鍑芥暟鎵嶄細鐢ㄥ弬鏁皀ew浠h〃鐨勬柊鍊兼浛鎹㈡帀鍘熷厛鐨勬棫鍊笺€傚惁鍒欙紝鍚庨潰鐨勬浛鎹㈡搷浣滃氨浼氳蹇界暐銆?br>
3. 杞藉叆
v := atomic.LoadInt32(&value)
鍑芥暟atomic.LoadInt32鎺ュ彈涓€涓?int32绫诲瀷鐨勬寚閽堝€硷紝骞朵細杩斿洖璇ユ寚閽堝€兼寚鍚戠殑閭d釜鍊?/p>
4. 瀛樺偍
鍦ㄥ師瀛愮殑瀛樺偍鏌愪釜鍊肩殑杩囩▼涓紝浠讳綍CPU閮戒笉浼氳繘琛岄拡瀵瑰悓涓€涓€肩殑璇绘垨鍐欐搷浣溿€?br>濡傛灉鎴戜滑鎶婃墍鏈夐拡瀵规鍊肩殑鍐欐搷浣滈兘鏀逛负鍘熷瓙鎿嶄綔锛岄偅涔堝氨涓嶄細鍑虹幇閽堝姝ゅ€肩殑璇绘搷浣滃洜琚苟鍙戠殑杩涜鑰岃鍒颁慨鏀逛簡涓€鍗婄殑鍊肩殑鎯呭喌浜嗐€?br>鍘熷瓙鐨勫€煎瓨鍌ㄦ搷浣滄€讳細鎴愬姛锛屽洜涓哄畠骞朵笉浼氬叧蹇冭鎿嶄綔鍊肩殑鏃у€兼槸浠€涔堛€?br>鍑芥暟atomic.StoreInt32浼氭帴鍙椾袱涓弬鏁般€傜涓€涓弬鏁扮殑绫诲瀷鏄?int 32绫诲瀷鐨勶紝鍏跺惈涔夊悓鏍锋槸鎸囧悜琚搷浣滃€肩殑鎸囬拡銆傝€岀浜屼釜鍙傛暟鍒欐槸int32绫诲瀷鐨勶紝瀹冪殑鍊煎簲璇ヤ唬琛ㄦ瀛樺偍鐨勬柊鍊笺€傚叾瀹冪殑鍚岀被鍑芥暟涔熶細鏈夌被浼肩殑鍙傛暟澹版槑鍒楄〃銆?br>
5. 浜ゆ崲
涓嶤AS鎿嶄綔涓嶅悓锛屽師瀛愪氦鎹㈡搷浣滀笉浼氬叧蹇冭鎿嶄綔鍊肩殑鏃у€笺€傚畠浼氱洿鎺ヨ缃柊鍊笺€備絾瀹冨張姣斿師瀛愯浇鍏ユ搷浣滃鍋氫簡涓€姝ャ€備綔涓轰氦鎹紝瀹冧細杩斿洖琚搷浣滃€肩殑鏃у€笺€傛绫绘搷浣滄瘮CAS鎿嶄綔鐨勭害鏉熸洿灏戯紝鍚屾椂鍙堟瘮鍘熷瓙杞藉叆鎿嶄綔鐨勫姛鑳芥洿寮恒€?br>浠tomic.SwapInt32鍑芥暟涓轰緥銆傚畠鎺ュ彈涓や釜鍙傛暟銆傜涓€涓弬鏁版槸浠h〃浜嗚鎿嶄綔鍊肩殑鍐呭瓨鍦板潃鐨?int32绫诲瀷鍊硷紝鑰岀浜屼釜鍙傛暟鍒欒鐢ㄦ潵琛ㄧず鏂板€笺€傛敞鎰忥紝璇ュ嚱鏁版槸鏈夌粨鏋滃€肩殑銆傝鍊煎嵆鏄鏂板€兼浛鎹㈡帀鐨勬棫鍊笺€俛tomic.SwapInt32鍑芥暟琚皟鐢ㄥ悗锛屼細鎶婄浜屼釜鍙傛暟鍊肩疆浜庣涓€涓弬鏁板€兼墍琛ㄧず鐨勫唴瀛樺湴鍧€涓婏紙鍗充慨鏀硅鎿嶄綔鍊硷級锛屽苟灏嗕箣鍓嶅湪璇ュ湴鍧€涓婄殑閭d釜鍊间綔涓虹粨鏋滆繑鍥炪€?br>
渚嬪瓙:
df.rmutex.Lock()
defer df.rmutex.Unlock()
return df.roffset / int64(df.dataLen)
鎴戜滑鐜板湪鍘绘帀鏂藉姞鍦ㄤ笂闈㈢殑閿佸畾鍜岃В閿佹搷浣滐紝杞€屼娇鐢ㄥ師瀛愭搷浣滄潵瀹炵幇瀹冦€備慨鏀瑰悗鐨勪唬鐮佸涓嬶細
offset := atomic.LoadInt64(&df.roffset)
return offset / int64(df.dataLen)
鐢ㄥ師瀛愭搷浣滄潵鏇挎崲mutex閿?br>
以上是关于Go璇█atomic鍘熷瓙鎿嶄綔的主要内容,如果未能解决你的问题,请参考以下文章
涓€瀵逛竴鍏宠仈鏌ヨ鏃朵娇鐢╮elation杩炶疮鎿嶄綔鏌ヨ鍚庯紝璋冪敤getLastSql()鏂规硶杈撳嚭鐨剆ql璇彞
Java鎿嶄綔JSON鏁版嵁--Gson鎿嶄綔JSON鏁版嵁