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

JavaJUCConcurrentLinkedQueue分析

时间:2023-04-01 22:42:17 Java

ConcurrentLinkedQueue鍘熺悊鎺㈢储浠嬬粛ConcurrentLinkedQueue鏄竴涓嚎绋嬪畨鍏ㄧ殑鏃犵晫闈為樆濉為槦鍒椼€傚簳灞傞€氳繃鍗曞悜閾捐〃瀹炵幇锛屽叆闃熷嚭闃熸搷浣滀娇鐢–AS瀹炵幇绾跨▼瀹夊叏銆侰oncurrentLinkedQueue鐨勫唴閮ㄩ槦鍒楁槸浣跨敤鍗曞悜閾捐〃瀹炵幇鐨勶紝鍏朵腑鏈変袱涓獀olatileNode鑺傜偣锛屽垎鍒敤鏉ュ瓨鏀鹃槦鍒楃殑澶磋妭鐐瑰拰灏捐妭鐐广€備粠涓嬮潰鐨勬棤鍙傛瀯閫犲嚱鏁板彲浠ョ湅鍑猴紝榛樿鐨勫ご灏捐妭鐐规寚鍚慽tem涓簄ull鐨剆entinel鑺傜偣銆傛柊鍏冪礌鎻掑叆鍒伴槦鍒楃殑鏈熬锛屽厓绱犱粠闃熷垪鐨勫ご閮ㄥ彇鍑恒€俻rivatetransientvolatileNode澶达紱privatetransientvolatileNode灏惧反锛沺ublicConcurrentLinkedQueue(){head=tail=newNode(null);}Node鑺傜偣涓淮鎶や簡涓€涓敤volatile淇グ鐨勫彉閲廼tem锛岀敤浜庡瓨鍌ㄨ妭鐐圭殑鍊硷紱next鐢ㄤ簬瀛樻斁閾捐〃鐨勪笅涓€涓妭鐐癸紱鍦ㄥ唴閮紝浣跨敤UNSafe宸ュ叿绫绘彁渚涚殑CAS绠楁硶鏉ヤ繚璇侀摼琛ㄦ搷浣滃湪鍏ラ槦鍜屽嚭闃熸椂鐨勫師瀛愭€с€俹ffer鎿嶄綔offer鎿嶄綔鏄湪闃熷垪鐨勬湯灏炬坊鍔犱竴涓厓绱犮€傚鏋滀紶閫掔殑鍙傛暟涓簄ull锛屽垯浼氭姏鍑哄紓甯搞€傚惁鍒欙紝鐢变簬ConcurrentLinkedQueue鏄棤鐣岄槦鍒楋紝姝ゆ柟娉曞皢濮嬬粓杩斿洖true銆傚彟澶栵紝鐢变簬浣跨敤浜咰AS绠楁硶锛岃繖涓柟娉曚笉浼氳闃诲鎸傝捣璋冪敤绾跨▼銆備笅闈㈢湅婧愮爜锛歱ublicbooleanoffer(Ee){//(1)濡傛灉涓簄ull鍒欐姏寮傚父checkNotNull(e);//(2)鏋勯€犱竴涓狽ode鑺傜偣锛屽唴閮ㄨ皟鐢╱nsafe.putObjectfinalNodenewNode=newNode(e);//(3)浠庡熬鑺傜偣鎻掑叆for(Nodet=tail,p=t;;){Nodeq=p.next;//锛?锛夊鏋渜==null锛岃〃绀簆涓哄熬鑺傜偣锛屾墽琛屾彃鍏f(q==null){//锛?锛変娇鐢–AS璁剧疆p鑺傜偣鐨勪笅涓€涓妭鐐筰f(p.casNext(null,newNode)){//(6)濡傛灉p!=t锛屽皢鍏ラ槦鑺傜偣璁剧疆涓哄熬鑺傜偣銆傛洿鏂板け璐ヤ篃鏃犳墍璋擄紝鍥犱负澶辫触鎰忓懗鐫€鍏朵粬绾跨▼宸茬粡鎴愬姛鏇存柊灏捐妭鐐筰f(p!=t)//涓€娆¤烦涓や釜鑺傜偣casTail(t,newNode);//澶辫触鏄彲浠ョ殑銆傝繑鍥炵湡锛泒}elseif(p==q)//(7)澶氱嚎绋嬭繍琛屾椂锛宧ead鍙兘鍙樻垚Self-reference锛屽嵆head鐨刵ext鍙樻垚head锛岃繖閲岄渶瑕佹壘涓€涓柊鐨刪eadp=(t!=(t=tail))?鍚細澶达紱else//(8)鎵惧埌灏捐妭鐐筽=(p!=t&&t!=(t=灏惧反锛夛級锛熷惃锛氶棶锛泒}鎴戜滑鏉ュ垎鏋愪竴涓嬭繖涓柟娉曠殑鎵ц娴佺▼銆傞鍏堬紝鍦ㄨ皟鐢ㄨ繖涓柟娉曟椂锛屼唬鐮侊紙1锛夋鏌ヤ紶鍏ョ殑鍙傛暟锛屽鏋滀负null鍒欐姏鍑哄紓甯革紝鍚﹀垯鎵ц浠g爜锛?锛夊苟浣跨敤item浣滀负鏋勯€犲嚱鏁板弬鏁板垱寤轰竴涓柊鑺傜偣锛岀劧鍚庝唬鐮侊紙3)浠庨槦灏剧殑鑺傜偣寮€濮嬪惊鐜紝鎵撶畻浠庨槦灏惧紑濮嬫坊鍔犲厓绱犮€傚綋浠g爜锛?锛夊埌杈炬椂锛岄槦鍒楃殑鐘舵€佸涓嬪浘鎵€绀恒€傛鏃讹紝鑺傜偣p銆乼銆乭ead銆乼ail閮芥寚鍚慽tem涓簄ull鐨剆entinel鑺傜偣銆傜敱浜庡摠鍏佃妭鐐圭殑涓嬩竴涓妭鐐逛负绌猴紝鎵€浠涔熶负绌恒€備唬鐮侊紙4锛夊彂鐜皅==null锛屽垯鎵ц浠g爜锛?锛夛紝浣跨敤CAS鍒ゆ柇p鑺傜偣鐨勪笅涓€涓妭鐐规槸鍚︿负null锛屼负null鍒欎娇鐢╪ewNode鏇挎崲p鐨勪笅涓€涓妭鐐癸紝鐒跺悗鎵ц浠g爜(6)锛屼絾鏄鏃秔==t鎵€浠ユ病鏈夎缃畉ail鑺傜偣锛岀劧鍚庨€€鍑簅ffer鏂规硶銆傞槦鍒楀綋鍓嶇殑鐘舵€佸涓嬪浘鎵€绀猴細鍒氭墠瑙i噴鐨勬槸涓€涓嚎绋嬭皟鐢╫ffer鏂规硶鐨勬儏鍐碉紝浣嗘槸濡傛灉澶氫釜绾跨▼鍚屾椂璋冪敤锛屽氨浼氬嚭鐜板涓嚎绋嬫墽琛屼唬鐮佺殑鎯呭喌锛?锛夊悓鏃躲€傚亣璁剧嚎绋?璋冪敤offer(item1)锛岀嚎绋?璋冪敤offer(item2)锛屼袱鑰呭悓鏃舵墽琛屼唬鐮?5)锛宲.casNext(null,newNode)銆傜敱浜嶤AS鏄師瀛愮殑锛屾垜浠亣璁剧嚎绋?鍏堟墽琛屼簡CAS鎿嶄綔锛屽彂鐜皃.next涓簄ull锛屽垯鏇存柊涓篿tem1銆傝繖鏃剁嚎绋?涔熶細鍒ゆ柇p.next鏄惁涓簄ull锛屽鏋滀笉涓簄ull鍒欒烦杞埌浠g爜锛?锛夛紝鐒跺悗鎵ц浠g爜锛?锛夈€傛鏃堕槦鍒楀垎甯冨涓嬪浘鎵€绀猴細鐒跺悗绾跨▼2鍙戠幇浠g爜锛?锛変笉婊¤冻锛屽垯璺宠浆鍒版墽琛屼唬鐮侊紙8锛夛紝鐒跺悗灏唓璧嬪€肩粰p銆傞槦鍒楃殑鐘舵€佸涓嬶細鐒跺悗绾跨▼2鍐嶆璺宠浆鍒颁唬鐮侊紙3锛夋墽琛屻€傛墽琛屼唬鐮侊紙4锛夋椂锛岄槦鍒楃殑鐘舵€佸涓嬪浘鎵€绀猴細姝ゆ椂q==null锛屾墍浠ョ嚎绋?浼氭墽琛屼唬鐮侊紙5锛夛紝閫氳繃CAS鎿嶄綔鍒ゆ柇p.next鑺傜偣鏄惁涓€鐗囩┖鐧姐€傚鏋滀负null锛屽垯浣跨敤item2鏇挎崲瀹冦€傚鏋滄病鏈夛紝缁х画寰幆銆傚亣璁綜AS鎴愬姛锛屾墽琛屼唬鐮侊紙6锛夈€傜敱浜巔!=t锛屽皢tail鑺傜偣璁剧疆涓篿tem2锛岀劧鍚庨€€鍑簅ffer鏂规硶銆傛鏃堕槦鍒楀垎甯冨涓嬶細鍒扮幇鍦ㄤ负姝紝鎴戜滑杩樻病鏈夋彁鍒颁唬鐮侊紙7锛夈€傚叾瀹炶繖涓€姝ヤ富瑕佹槸鍦╬oll鎿嶄綔鎵ц瀹屼箣鍚庢墽琛岀殑銆俻oll鎵ц杩囩▼涓彲鑳戒細鍑虹幇濡備笅鎯呭喌锛氭垜浠潵鍒嗘瀽涓€涓嬶紝濡傛灉杩欎釜鐘舵€佽皟鐢╫ffer娣诲姞鍏冪礌锛屾墽琛屼唬鐮侊紙4锛夋椂鐨勭姸鎬佸浘濡備笅锛氳繖閲岋紝鐢变簬q鑺傜偣涓嶄负绌猴紝p==q锛屾墽琛屼唬鐮侊紙7锛夛紝鍥犱负t==tail锛屾墍浠琚祴涓篽ead锛岀劧鍚庡啀娆″惊鐜紝寰幆鍚庢墽琛屼唬鐮侊紙4锛夛紝闃熷垪鐘舵€佸涓嬶細姝ゆ椂锛屽洜涓簈==null锛屾墽琛屼唬鐮侊紙5锛夎繘琛孋AS鎿嶄綔锛屽鏋滃綋鍓嶆病鏈夊叾浠栫嚎绋嬪湪鎵цoffer鎿嶄綔锛屽垯CAS鎿嶄綔鎴愬姛锛宲.next鑺傜偣浼氳璁剧疆涓烘柊鍔犲叆鐨勮妭鐐广€傜劧鍚庢墽琛屼唬鐮侊紙6锛夈€傜敱浜巔!=t锛屽皢鏂拌妭鐐硅缃负闃熷垪鐨勫熬鑺傜偣銆傜幇鍦ㄩ槦鍒楃殑鐘舵€佸涓嬶細馃摙闇€瑕佹敞鎰忕殑鏄繖閲岀殑鑷紩鐢ㄨ妭鐐逛細琚瀮鍦惧洖鏀躲€傛€荤粨锛歰ffer鎿嶄綔鐨勫叧閿楠ゆ槸浠g爜锛?锛夛紝閫氳繃CAS鎿嶄綔鏉ユ帶鍒跺悓涓€鏃跺埢鍙兘鏈変竴涓嚎绋嬭拷鍔犲厓绱犲埌闃熷熬锛屽け璐ョ殑绾跨▼浼氬湪a涓皾璇旵AS鎿嶄綔寰幆鐩村埌CAS鎴愬姛銆俛dd鎿嶄綔add鎿嶄綔鏄湪閾捐〃鐨勬湯灏炬坊鍔犱竴涓厓绱狅紝鍐呴儴璋冪敤offer鏂规硶銆俻ublicbooleanadd(Ee){returnoffer(e);}杞鎿嶄綔杞鎿嶄綔鏄幏鍙栧苟绉婚櫎闃熷垪澶撮儴鐨勪竴涓厓绱狅紝濡傛灉闃熷垪涓虹┖鍒欒繑鍥瀗ull銆傛垜浠潵鐪嬬湅杩欎釜鏂规硶鐨勫疄鐜板師鐞嗐€俻ublicEpoll(){//(1)gotomarkrestartFromHead://(2)鏃犻檺寰幆for(;;){for(Nodeh=head,p=h,q;;){//(3锛変繚瀛樺綋鍓嶈妭鐐笶item=p.item锛?/(4)褰撳墠鑺傜偣鏈夊€硷紝CAS鍙樹负nullif(item!=null&&p.casItem(item,null)){//(5)CAS鎴愬姛鐒跺悗鏍囪褰撳墠鑺傜偣锛屽鏋滃垹闄?p!=h)//涓€娆¤烦涓や釜鑺傜偣//鏇存柊澶磋妭鐐箄pdateHead(h,((q=p.next)!=null)?q:p);褰掕繕鐗╁搧;}//(6)濡傛灉褰撳墠闃熷垪涓虹┖鍒欒繑鍥瀗ullelseif((q=p.next)==null){updateHead(h,p);杩斿洖绌哄€硷紱}//(7)濡傛灉褰撳墠鑺傜偣鏄疭elf-reference锛屽垯閲嶆柊瀵绘壘澶磋妭鐐筫lseif(p==q)continuerestartFromHead;else//(8)濡傛灉涓嬩竴涓厓绱犱笉涓虹┖锛屽垯灏嗗ご鑺傜偣鐨勪笅涓€涓妭鐐硅缃负澶磋妭鐐筽=q;}}}finalvoidupdateHead(Nodeh,Nodep){if(h!=p&&casHead(h,p))h.lazySetNext(h);}鐢变簬poll鏂规硶鏄粠澶撮儴鑾峰彇涓€涓厓绱犲苟绉婚櫎锛屼唬鐮?2)鐨勫唴灞傚惊鐜粠澶撮儴鑺傜偣寮€濮嬶紝浠g爜(3)鑾峰彇褰撳墠闃熷垪澶撮儴鑺傜偣锛岀劧鍚庨槦鍒楀垵濮嬩负绌洪槦鍒楃殑鐘舵€佸涓嬶細鐢变簬澶磋妭鐐规寚鍚戠殑椤规槸绌哄摠鍏佃妭鐐癸紝鍥犳灏嗘墽琛屼唬鐮侊紙6锛夈€傚亣璁惧湪杩欎釜杩囩▼涓病鏈夌嚎绋嬭皟鐢╫ffer鏂规硶锛岄偅涔堟鏃秖绛変簬null锛岄槦鍒楃姸鎬佸涓嬶細鎵цupdateHead鏂规硶锛屽洜涓篽==p锛屾墍浠ュご鑺傜偣涓烘湭璁剧疆锛岀劧鍚庤繑鍥瀗ull鍋囪鍦ㄦ墽琛屼唬鐮侊紙6锛夋椂锛屽叾浠栫嚎绋嬪凡缁忚皟鐢ㄤ簡offer鏂规硶锛屽苟鎴愬姛鍚戦槦鍒椾腑娣诲姞浜嗕竴涓厓绱犮€傛鏃秖鎸囧悜鐨勬槸涓€涓柊娣诲姞鐨勫厓绱犺妭鐐癸紝濡備笅鍥撅細閭d箞濡傛灉涓嶆弧瓒充唬鐮?6)(q=p.next)==null锛屽綋浠g爜(7)涓烘墽琛屽悗锛宲!=q浼氭墽琛屼唬鐮侊紙8锛夛紝鐒跺悗灏唒鎸囧悜鑺傜偣q锛岄槦鍒楃殑鐘舵€佸涓嬶細鐒跺悗绋嬪簭鎵ц浠g爜锛?锛夛紝p鐜板湪涓嶆寚鍚憂ull锛岄偅涔堟墽琛宲.casItem(item,null)灏濊瘯閫氳繃CAS鎿嶄綔灏唒鐨刬tem鍊艰缃负null锛屽鏋滆繖涓狢AS鎴愬姛锛屽垯鎵ц浠g爜(5)銆傛鏃秔!=h灏嗗ご鑺傜偣璁剧疆涓簆锛屽皢h鐨勪笅涓€涓妭鐐硅缃负鑷繁锛岀劧鍚巔oll杩斿洖绉婚櫎鐨勮妭鐐归」銆傞槦鍒楀浘濡備笅锛氬綋鍓嶉槦鍒楃姸鎬佸氨鏄垰鎵嶈offer鎿嶄綔鏃朵唬鐮侊紙7锛夌殑鐘舵€併€傜幇鍦ㄨ繕鏈変唬鐮侊紙7锛夋病鏈夋墽琛岋紝鐪嬬湅浠€涔堟椂鍊欐墽琛屻€傚亣璁惧綋绾跨▼1鎵цpoll鎿嶄綔鏃讹紝闃熷垪鐨勭姸鎬佸涓嬶細鐒跺悗鎵цp.casItem(item,null)灏濊瘯閫氳繃CAS鎿嶄綔灏唒鐨刬tem鍊艰缃负null銆傚鏋淐AS璁剧疆鎴愬姛锛屾爣璁拌鑺傜偣骞朵粠闃熷垪涓Щ闄ゃ€傞槦鍒楃殑鐘舵€佸涓嬶細閭d箞锛屽洜涓簆!=h锛屾墍浠ヤ細鎵цupdateHead鏂规硶銆傚鏋滅嚎绋?鍦ㄥ彟涓€涓嚎绋?寮€濮媝oll鎿嶄綔涔嬪墠鎵ц浜唘pdateHead锛屾鏃剁嚎绋?鐨刾鎸囧悜澶磋妭鐐癸紝浣嗘槸浠g爜(6)锛屾鏃堕槦鍒楃殑鐘舵€佸涓嬶細鐒跺悗绾跨▼1鎵цupdateHead鎿嶄綔锛岀嚎绋?鎵ц瀹屾垚鍚庨€€鍑恒€傛鏃堕槦鍒楃殑鐘舵€佸涓嬶細鐒跺悗绾跨▼2缁х画鎵ц浠g爜锛?锛夛紝q=p.next锛屽洜涓鸿妭鐐规槸鑷紩鐢ㄨ妭鐐癸紝鎵€浠==q锛屾墍浠ヤ唬鐮佷細鏄墽琛?7)锛岃烦杞埌澶栧眰寰幆restartFromHead锛岃幏鍙栧綋鍓嶉槦澶淬€傜洰鍓嶇姸鎬佸涓嬶細鎬荤粨锛歱oll鏂规硶绉婚櫎鍏冪礌鏃讹紝鍙槸绠€鍗曞湴浣跨敤CAS鎿嶄綔灏嗗綋鍓嶈妭鐐圭殑item鍊艰缃负null锛岀劧鍚庨€氳繃閲嶇疆澶磋妭鐐逛粠闃熷垪涓Щ闄ゅ厓绱犮€傝绉婚櫎鐨勮妭鐐规垚涓哄鍎胯妭鐐癸紝杩欎釜鑺傜偣浼氬湪鍨冨溇鍥炴敹鏃惰鍥炴敹銆傚彟澶栵紝濡傛灉鍦ㄦ墽琛屽垎鏀腑鍙戠幇澶磋妭鐐硅淇敼锛屽垯璺宠浆鍒板灞傚惊鐜噸鏂拌幏鍙栨柊鐨勫ご鑺傜偣銆俻eek鎿嶄綔peek鎿嶄綔鏄幏鍙栭槦鍒楀ご閮ㄧ殑涓€涓厓绱狅紙鍙幏鍙栦笉绉婚櫎锛夛紝濡傛灉闃熷垪涓虹┖鍒欒繑鍥瀗ull銆傛垜浠潵鐪嬬湅瀹冪殑瀹炵幇鍘熺悊銆俻ublicEpeek(){//1.restartFromHead:for(;;){for(Nodeh=head,p=h,q;;){//2.E椤?p銆傜墿鍝?//3.if(item!=null||(q=p.next)==null){updateHead(h,p);褰掕繕鐗╁搧;}//4銆俥lseif(p==q)continuerestartFromHead;//5.鍚﹀垯p=q;}}}peek鎿嶄綔鐨勪唬鐮佺粨鏋勪笌poll鎿嶄綔绫讳技锛屼笉鍚岀殑鏄唬鐮侊紙3锛変腑灏戜簡castItem鎿嶄綔銆傚叾瀹炶繖鏄甯哥殑锛屽洜涓簆eek鍙槸鑾峰彇闃熷ご鍏冪礌鐨勫€硷紝骞舵病鏈夋竻闄ゅ畠鐨勫€笺€傛牴鎹墠闈㈢殑浠嬬粛锛屾垜浠煡閬撳湪绗竴娆℃墽琛宱ffer涔嬪悗锛宧ead鎸囧悜浜唖entinel鑺傜偣锛堜篃灏辨槸item涓簄ull鐨勮妭鐐癸級锛岄偅涔堝湪绗竴娆℃墽琛宲eek鐨勬椂鍊欙紝灏变細鍦ㄤ唬鐮侊紙3锛変腑鎵惧埌item==null锛岀劧鍚庢墽琛宷=p.next锛屾鏃秖鑺傜偣鎸囧悜闃熷垪涓涓€涓湡姝g殑鍏冪礌锛屽鏋滈槦鍒椾负null鍒檘鎸囧悜null銆傚綋闃熷垪涓虹┖鏃讹紝闃熷垪濡備笅锛氭鏃舵墽琛寀pdateHead锛岀敱浜巋鑺傜偣绛変簬p鑺傜偣锛屾墍浠ヤ笉鍋氫换浣曟搷浣滐紝鐒跺悗peek鎿嶄綔浼氳繑鍥瀗ull銆傚綋闃熷垪涓嚦灏戞湁涓€涓厓绱犳椂锛堝亣璁惧彧鏈変竴涓級锛岄槦鍒楃殑鐘舵€佸涓嬶細姝ゆ椂鎵ц浠g爜锛?锛夛紝p鎸囧悜鑺傜偣q锛岀劧鍚庢墽琛屼唬鐮侊紙3锛夎鎵ц銆傛鏃堕槦鍒楃殑鐘舵€佸涓嬶細鎵ц浠g爜锛?锛夊彂鐜癷tem涓嶄负null锛屼簬鏄墽琛屼簡updateHead鏂规硶銆傜敱浜巋!=p锛屽洜姝よ缃簡澶磋妭鐐广€傝缃畬鎴愬悗锛岄槦鍒楃姸鎬佸涓嬶細鏈€鍚庯紝sentinel鑺傜偣琚Щ闄ゃ€傛€荤粨锛歱eek鎿嶄綔鐨勪唬鐮佸拰poll鎿嶄綔绫讳技锛屽彧鏄墠鑰呭彧鑾峰彇闃熷垪鐨勫ご閮ㄥ厓绱狅紝骞朵笉浠庨槦鍒椾腑鍒犻櫎锛岃€屽悗鑰呰幏鍙栧埌鍚庨渶瑕佷粠闃熷垪涓垹闄ゃ€傚彟澶栵紝褰撶涓€娆¤皟鐢╬eek鎿嶄綔鏃讹紝sentinel鑺傜偣浼氳鍒犻櫎锛岄槦鍒楃殑澶磋妭鐐逛細鎸囧悜闃熷垪鐨勭涓€涓厓绱犳垨鑰呬负null銆俿ize鎿嶄綔璁$畻鐨勬槸褰撳墠闃熷垪涓殑鍏冪礌涓暟锛屽湪骞跺彂鐜涓嬬敤澶勪笉澶э紝鍥犱负CAS娌℃湁鍔犻攣锛屾墍浠ュ湪璋冪敤size鏂规硶鍒拌繑鍥炵粨鏋滅殑杩欐鏃堕棿鍙兘浼氬鍔犳垨鍒犻櫎鍏冪礌锛屽鑷村湪鍏冪礌鏁伴噺鐨勪笉鍑嗙‘璁℃暟涓€俻ublicintsize(){intcount=0;for(Nodep=first();p!=null;p=succ(p))if(p.item!=null)//Collection.size()瑙勮寖璇磋鏈€澶у寲if(++count==Integer.MAX_VALUE)涓柇锛況eturncount;}//鑾峰彇绗竴涓槦鍒楀厓绱狅紝锛堟窐姹皊entinel鑺傜偣锛夛紝娌℃湁鍒欎负nullNodefirst(){restartFromHead:for(;;){for(Nodeh=head,p=h,q;;){booleanhasItem=(p.item!=null);if(hasItem||(q=p.next)==null){updateHead(h,p);杩斿洖hasItem锛焢锛氱┖锛泒elseif(p==q)continuerestartFromHead;鍚﹀垯p=q锛涘鏋滄湁澶氫釜鍏冪礌锛屽垹闄ょ涓€涓繑鍥瀟rue锛屽惁鍒欒繑鍥瀎alse銆俻ublicbooleanremove(Objecto){if(o!=null){Nodenext,pred=null;for(Nodep=first();p!=null;pred=p,p=next){booleanremoved=false;Eitem=p.item;if(item!=null){//濡傛灉涓嶅尮閰嶏紝鍒欒幏鍙栦笅涓€涓妭鐐圭户缁尮閰峣f(!o.equals(item)){next=succ(p);缁х画;}//濡傛灉鐩哥瓑锛岀敤CAS缃负nullremoved=p.casItem(item,null);}//鑾峰彇琚垹闄よ妭鐐圭殑鍚庣户鑺傜偣next=succ(p);//濡傛灉鏈夊墠椹辫妭鐐癸紝涓攏ext鑺傜偣涓嶄负null锛屽垯灏嗗墠椹辫妭鐐归摼鎺ュ埌涓嬩竴涓妭鐐筰f(pred!=null&&next!=null)//unlink//浠庨槦鍒椾腑绉婚櫎鍒犻櫎鐨勮妭鐐归€氳繃CASpred.casNext(p,next);濡傛灉锛堝垹闄わ級杩斿洖鐪燂紱}}returnfalse;}contains鎿嶄綔鍒ゆ柇鎸囧畾瀵硅薄鏄惁鍦ㄩ槦鍒椾腑锛屽洜涓洪亶鍘嗕簡鏁翠釜闃熷垪锛屾墍浠ョ粨鏋滀笉鍍弒ize鎿嶄綔閭d箞鍑嗙‘锛屾湁鍙兘鍏冪礌杩樺湪闃熷垪涓綋璋冪敤璇ユ柟娉曟椂锛屼絾鍏朵粬绾跨▼鍦ㄩ亶鍘嗚繃绋嬩腑鍒犻櫎浜嗚鍏冪礌锛屽垯杩斿洖false銆俻ublicbooleancontains(Objecto){if(o==null)returnfalse;for(Nodep=first();p!=null;p=succ(p)){Eitem=p.item;濡傛灉锛堥」鐩紒=null&&o.equals锛堥」鐩級锛夎繑鍥炵湡锛泒returnfalse;}鎬荤粨ConcurrentLinkedQueue搴曞眰閲囩敤鍗曞悜閾捐〃鏁版嵁缁撴瀯瀛樺偍闃熷垪鍏冪礌锛屾瘡涓厓绱犺灏佽鎴愪竴涓狽ode鑺傜偣銆傞槦鍒楃敱澶磋妭鐐瑰拰灏捐妭鐐圭淮鎶ゃ€傚垱寤洪槦鍒楁椂锛屽ご鑺傜偣鍜屽熬鑺傜偣鎸囧悜涓€涓猧tem涓簄ull鐨勫摠鍏佃妭鐐广€傜涓€娆℃煡鐪嬫垨绗竴娆℃搷浣滃皢鎸囧悜绗竴涓湡姝g殑闃熷垪鍏冪礌銆傜敱浜庝娇鐢ㄤ簡闈為樆濉炵殑CAS绠楁硶锛屾病鏈夊姞閿侊紝鍦ㄨ绠梥ize鐨勬椂鍊欐湁鍙兘浼氳繘琛宱ffer銆乸oll銆乺emove绛夋搷浣滐紝瀵艰嚧璁$畻鍑虹殑鍏冪礌涓暟涓嶅噯纭紝鎵€浠ize鏂规硶鐢ㄥ涓嶅ぇ骞跺彂鎯呭喌銆?/p>

最新推荐
猜你喜欢