闭锁这个词源于 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 示例

  1. package com.tonny.thread;
  2. import java.util.concurrent.CountDownLatch;
  3. public class Driver { // ...
  4. public static void main(String[] args) throws InterruptedException {
  5. int N = 10;
  6. CountDownLatch startSignal = new CountDownLatch(1);
  7. CountDownLatch doneSignal = new CountDownLatch(N);
  8. for (int i = 0; i < N; ++i) // create and start threads
  9. new Thread(new Worker(startSignal, doneSignal)).start();
  10. System.out.println("main run ============="); // don't let run yet
  11. startSignal.countDown(); // let all threads proceed
  12. System.out.println("all start working");
  13. doneSignal.await(); // wait for all to finish
  14. System.out.println("all worker finished");
  15. }
  16. }
  17. class Worker implements Runnable {
  18. private final CountDownLatch startSignal;
  19. private final CountDownLatch doneSignal;
  20. Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {
  21. this.startSignal = startSignal;
  22. this.doneSignal = doneSignal;
  23. }
  24. public void run() {
  25. try {
  26. startSignal.await();
  27. doWork();
  28. doneSignal.countDown();
  29. } catch (InterruptedException ex) {} // return;
  30. }
  31. void doWork() {
  32. System.out.println("I'm working");
  33. }
  34. }

go 实现

两个 WaitGroup 实现

  1. func main() {
  2. var wgstart sync.WaitGroup
  3. var wgend sync.WaitGroup
  4. N := 100
  5. wgstart.Add(1)
  6. for i := 0; i < N; i++ {
  7. wgend.Add(1)
  8. go func() {
  9. wgstart.Wait()
  10. fmt.Println("I.m working ...........")
  11. wgend.Done()
  12. }()
  13. }
  14. fmt.Println("all start working")
  15. wgstart.Done()
  16. wgend.Wait()
  17. fmt.Println("all worker finished")
  18. }