package main

import (
	"log"
	"math/rand"
	"sync"
	"time"
)

func main() {
	var cc = make([]*sync.Mutex, 1001)
	for i := 0; i < len(cc); i++ {
		m := &sync.Mutex{}
		m.Lock()
		cc[i] = m
	}
	for i := 1000; i > 0; i-- {
		go gog(i, cc)
	}
	cc[0].Unlock()
	cc[1000].Lock()
	cc[1000].Unlock()
}

func gog(index int, cc []*sync.Mutex) {
	cc[index-1].Lock()
	time.Sleep(time.Millisecond * time.Duration(rand.Intn(20)))
	log.Println(index)
	cc[index-1].Unlock()
	cc[index].Unlock()
}