Another goroutine, once it knows that the condition might be met, can call Signal() or Broadcast() to wake up the waiting goroutine(s) and let them know it’s time to move on. // Suspends the calling goroutine until the condition is met func ( c * Cond ) Wait () {} // Wakes up one waiting goroutine, if there is one func ( c * Cond ) Signal () {} // Wakes up all waiting goroutines func ( c * Cond ) Broadcast () {} The key part here is that the mutex must be locked before calling Wait() because Wait() does something important, it automatically releases the lock (calls Unlock() ) before putting the goroutine to sleep.