浠婂ぉ璇︾粏浠嬬粛JUC鐨勪竴浜涘父鐢ㄥ悓姝ュ伐鍏风被锛孋ountDownLatch銆丆yclicBarrier銆丼emaphore鐨勪娇鐢ㄤ笌鍖哄埆銆侰ountDownLatch鐨勪綔鐢細涓€涓垨澶氫釜绾跨▼鍦ㄥ紑濮嬫墽琛屾搷浣滀箣鍓嶅繀椤荤瓑寰呭叾浠栫嚎绋嬪畬鎴愩€傜被鏋勯€犲嚱鏁癈ountDownLatch(intcount)鏋勯€犱竴涓敤缁欏畾璁℃暟鍒濆鍖栫殑鍊笺€俻ublicCountDownLatch(intcount){if(count<0)thrownewIllegalArgumentException("count<0");this.sync=newSync(count);}鏍稿績鏂规硶countDown()閫掑噺latch鐨勮鏁帮紝濡傛灉璁℃暟涓洪浂锛屽皢閲婃斁鎵€鏈夌瓑寰呯嚎绋媝ublicvoidcountDown(){sync.releaseShared(1);await()瀵艰嚧褰撳墠绾跨▼绛夊緟锛岀洿鍒伴攣瀛樺櫒鍊掕鏃朵负闆躲€俻ublicvoidawait()throwsInterruptedException{sync.acquireSharedInterruptibly(1);}褰撲竴涓嚎绋嬭皟鐢╝wait()鏂规硶鏃讹紝褰撳墠绾跨▼浼氳闃诲銆傚綋涓€涓嚎绋嬭皟鐢ㄤ竴娆ountDown()鏂规硶鏃讹紝count浼氬噺涓€锛岃闃诲鐨勭嚎绋嬪彲浠ョ户缁墽琛岋紝鐩村埌count鐨勫€肩瓑浜?銆傜幇鍦ㄦ垜浠妇涓€涓敓娲讳腑鐨勪緥瀛愭潵璇存槑锛氬綋鎴戜滑杩樻槸瀛︾敓鐨勬椂鍊欙紝鎴戜滑鑰冭瘯鐨勬椂鍊欙紝鐩戣€冭€佸笀瑕佺瓑鍒版墍鏈夌殑瀛︾敓閮戒氦鍗蜂簡鎵嶈蛋銆傝繖鏃跺€欑洃鑰冨畼灏辩浉褰撲簬鍦ㄧ瓑绾垮ご锛屽悓瀛︿滑灏卞儚鍦ㄦ墽琛屾簝璐ャ€傛垜浠敤浠g爜鏉ュ疄鐜拌繖涓渚嬶細10涓悓瀛﹀弬鍔犺€冭瘯锛屼富绾跨▼鐩稿綋浜庣洃鑰冨憳publicclassCountDownLatchDemo{privatestaticCountDownLatchcountDownLatch=newCountDownLatch(10);publicstaticvoidmain(String[]args)throwsInterruptedException{for(inti=1;i<=10;i++){newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println(Thread.currentThread().getName()+"\tstudentHandin:");//鍑忎竴countDownLatch.countDown();}},String.valueOf(i)).start();}//绛夊緟countDownLatch.await();System.out.println(Thread.currentThread().getName()+"\t鐩戣€冭€佸笀绂诲紑鏁欏");}}搴曞眰瀹炵幇鍘熺悊浠庢簮鐮佷腑涓嶉毦鍙戠幇CountDownLatch鏄熀浜嶢QS瀹炵幇鐨勩€傚綋鎴戜滑鏋勫缓CountDownLatch瀵硅薄鏃讹紝浼犲叆鐨勫€煎疄闄呬笂浼氳璧嬪€肩粰AQS鐨勫叧閿彉閲弒tate锛屽綋countDown()鏂规硶鎵ц鏃讹紝state瀹為檯涓婃槸浣跨敤CAS鍑忎竴銆俛wait()鏂规硶鎵ц鏃讹紝鍏跺疄鏄垽鏂璼tate鏄惁涓?锛屼笉涓?鍒欏姞鍏ラ槦鍒楋紝绾跨▼闃诲锛堝ご鑺傜偣闄ゅ锛夛紝鍥犱负澶磋妭鐐逛細涓€鐩磋嚜鏃嬬瓑寰呯姸鎬佷负0锛屽綋鐘舵€佷负0鏃讹紝澶磋妭鐐逛篃浼氬皢鍓╀綑鐨勯樆濉炶妭鐐瑰寘鍚湪闃熷垪涓敜閱扖yclicBarrier鐨勬晥鏋滐細N涓嚎绋嬬浉浜掔瓑寰咃紝鎵€鏈夌嚎绋嬪繀椤荤瓑寰呬换浣曚竴涓嚎绋嬪畬鎴愩€傚父鐢ㄧ殑鏋勯€犳柟娉曟湁锛欳yclicBarrier(intparties,RunnablebarrierAction)鍒涘缓涓€涓柊鐨凜yclicBarrier锛屽畠浼氬湪缁欏畾鏁伴噺鐨勭嚎绋嬪浜庣瓑寰呯姸鎬佹椂鍚姩锛屽苟鍦ㄥ惎鍔╞arrier鏃舵墽琛岀粰瀹氱殑barrier鎿嶄綔锛岀敱last杩涘叆灞忛殰鐨勭嚎绋嬫搷浣減ublicCyclicBarrier(intparties,RunnablebarrierAction){if(parties<=0)thrownewIllegalArgumentException();this.parties=娲惧锛泃his.count=娲惧锛泃his.barrierCommand=barrierAction;}鏍稿績鏂规硶await()绛夊緟鎵€鏈夊弬涓庤€呭湪姝ら殰纰嶄笂璋冪敤await鏂规硶publicintawait()throwsInterruptedException,BrokenBarrierException{try{returndowait(false,0L);}catch(TimeoutExceptiontoe){thrownewError(toe);//涓嶅彲鑳藉彂鐢焳}鐢熸椿涓殑渚嬪瓙锛氱帺鐜嬭€呯殑鏃跺€欙紝蹇呴』鎵€鏈変汉閮藉姞杞藉埌100%鎵嶈兘杩涘叆娓告垙銆傚惁鍒欐墍鏈夌帺瀹朵簰鐩哥瓑寰呫€俻ublicclassCyclicBarrierDemo{publicstaticvoidmain(String[]args){CyclicBarriercyclicBarrier=newCyclicBarrier(5,()->System.out.println("娓告垙寮€濮?));for(inti=1;i<=5;i++){intfinalI=i;newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println("Part"+finalI+"EnterGame");try{cyclicBarrier.await();}catch(InterruptedExceptione){e.printStackTrace();}catch(BrokenBarrierExceptione){e.printStackTrace();}}},String.valueOf(i)).start();}}}鎬荤粨锛欳yclicBarrier鏋勯€犳柟娉曠殑绗竴涓弬鏁版槸鐩爣barrier鐨勪釜鏁般€傛瘡娆℃墽琛孋yclicBarrier鏃讹紝闅滅鐨勬暟閲忛兘浼氬鍔犱竴涓€傚鏋滆揪鍒扮洰鏍囬殰纰嶆暟锛屽皢鎵цawait()涔嬪悗鐨勬柟娉曘€傚簳灞傚疄鐜板師鐞嗕粠婧愮爜涓笉闅惧彂鐜帮紝瀹冨苟娌℃湁鍍廋ountDownLatch鍜孯eentrantLock涓€鏍蜂娇鐢ˋQS鐨勭姸鎬佸彉閲忥紝鑰孋yclicBarrier鏄洿鎺ヤ娇鐢≧eentrantLock鍔犱笂绛夊緟Condition鍞ら啋鐨勫姛鑳藉疄鐜扮殑銆傚湪鏋勫缓CyclicBarrier鏃讹紝浼犲叆鐨勫€间細璧嬪€肩粰CyclicBarrier鍐呴儴缁存姢鐨刢ount鍙橀噺锛屽悓鏃朵篃浼氳祴鍊肩粰parties鍙橀噺銆傛瘡娆¤皟鐢╝wait()鏂规硶鏃讹紝璁℃暟閮戒細鍑忎竴銆傝鏁板€肩洿鎺ョ敤浜庝繚璇佺嚎绋嬪畨鍏ㄣ€傚鏋渃ount涓嶄负0锛屽垯灏嗗叾娣诲姞鍒癈ondition闃熷垪涓€傚鏋渃ount绛変簬0锛屽垯灏嗚妭鐐逛粠Condition闃熷垪鍔犲叆AQS闃熷垪鍞ら啋鎵€鏈夎妭鐐癸紝parties鐨勫€奸噸鏂拌祴缁檆ount鐨勫€笺€係emaphore淇″彿閲忕敤浜庢帶鍒跺悓鏃惰闂祫婧愮殑绾跨▼鏁帮紝鎺у埗涓€鑸簲鐢ㄥ満鏅殑娴侀噺銆傛瀯閫犲嚱鏁癝emaphore(intpermits)鍒涘缓涓€涓猄emapore锛屽畠鍏锋湁缁欏畾鐨勮鍙暟鍜岄潪鍏钩鍏钩璁剧疆銆俻ublicSemaphore(intpermits){sync=newNonfairSync(permits);}鏍稿績鏂规硶acquire()浠庤繖涓俊鍙烽噺涓幏鍙栦竴涓猵ermit锛屽湪鎻愪緵permit涔嬪墠闃诲绾跨▼锛屽惁鍒欑嚎绋嬩腑鏂紝release()閲婃斁涓€涓猵ermit锛岃繑鍥炵粰semaphore锛岃缃厑璁哥殑涓暟Semaphoresemaphore=newSemaphore(3)锛屼竴鑸琣cquire()浼氭姏鍑哄紓甯革紝閲婃斁鍦╢inally涓墽琛屻€俻ublicvoidacquire()throwsInterruptedException{sync.acquireSharedInterruptibly(1);}publicvoidrelease(){sync.releaseShared(1);}姣斿6杈嗚溅馃殫寮虹珯涓変釜杞︿綅銆俻ublicclassSemaphoreDemo{publicstaticvoidmain(String[]args){//妯℃嫙璧勬簮绫伙紝鏈?涓┖杞︿綅Semaphoresemaphore=newSemaphore(3);for(inti=1;i<=6;i++){newThread(()->{try{semaphore.acquire();System.out.println(Thread.currentThread().getName()+"\t鎶簡涓€涓仠杞︿綅");TimeUnit.SECONDS.sleep(3);}catch(InterruptedExceptione){e.printStackTrace();}finally{semaphore.release();}System.out.println(Thread.currentThread().getName()+"\t绂诲紑杞︿綅");semaphore.release();},String.valueOf(i)).start();}}}Semaphore搴曞眰瀹炵幇鏄熀浜嶢QS鐨勶紝绫讳技浜嶤ountDownLatch鎬荤粨CountDownLatch锛孲emaphore閮芥槸鍩轰簬AQS瀹炵幇鐨勩€侰ountDownLatch鏄竴涓嚎绋嬬瓑寰呭叾浠栫嚎绋嬶紝鑰孋yclicBarrier鏄嚎绋嬩箣闂翠簰鐩哥瓑寰呫€侰ountDownLatch浼氬皢鏋勯€燙ountDownLatch鐨勫叆鍙備紶缁欑姸鎬併€俢ountDown()鏄埄鐢–AS灏嗙姸鎬佸噺涓€锛岃€宎wait()瀹為檯涓婃槸璁╁ご鑺傜偣绛夊緟鐘舵€佷负0锛岄噴鏀炬墍鏈夌瓑寰呯殑绾跨▼銆侰yclicBarrier浣跨敤ReentrantLock鍜孋ondition鏉ョ淮鎶ount鍜宲arties鍙橀噺銆傛瘡娆¤皟鐢╝wait閮戒細灏嗚鏁板噺涓€锛屽苟灏嗙嚎绋嬫坊鍔犲埌鏉′欢闃熷垪涓€傚綋count涓?鏃讹紝Condition闃熷垪涓殑鑺傜偣浜ょ粰AQS闃熷垪锛屽叏閮ㄩ噴鏀俱€傛枃绔犻摼鎺ワ細CountDownLatch銆丆yclicBarrier銆丼emaphore鐨勪娇鐢ㄥ強搴曞眰瀹炵幇
