闭锁这个词源于 jdk 1.5 中新增了一个类: CountDownLatch
A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.
同步辅助类, 允许一个或多个线程等待直到其他线程的一系列操作完成, 才放开这些线程的执行
一直觉的go的 WaitGroup 和 java的闭锁比较像对比一下实现:
java 示例
package com.tonny.thread;import java.util.concurrent.CountDownLatch;public class Driver { // ...public static void main(String[] args) throws InterruptedException {int N = 10;CountDownLatch startSignal = new CountDownLatch(1);CountDownLatch doneSignal = new CountDownLatch(N);for (int i = 0; i < N; ++i) // create and start threadsnew Thread(new Worker(startSignal, doneSignal)).start();System.out.println("main run ============="); // don't let run yetstartSignal.countDown(); // let all threads proceedSystem.out.println("all start working");doneSignal.await(); // wait for all to finishSystem.out.println("all worker finished");}}class Worker implements Runnable {private final CountDownLatch startSignal;private final CountDownLatch doneSignal;Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {this.startSignal = startSignal;this.doneSignal = doneSignal;}public void run() {try {startSignal.await();doWork();doneSignal.countDown();} catch (InterruptedException ex) {} // return;}void doWork() {System.out.println("I'm working");}}
go 实现
两个 WaitGroup 实现
func main() {var wgstart sync.WaitGroupvar wgend sync.WaitGroupN := 100wgstart.Add(1)for i := 0; i < N; i++ {wgend.Add(1)go func() {wgstart.Wait()fmt.Println("I.m working ...........")wgend.Done()}()}fmt.Println("all start working")wgstart.Done()wgend.Wait()fmt.Println("all worker finished")}
