Go - mutual exclusion
- Ex. Binary semaphore
- Race Condition

- Semaphore

- Ex. sync.MutexMutex.Unlock happens before Mutex.Lock

- Every Lock needs Unlock, can use defer to prevent missing Unlock


- Go's mutex is not is not re-entrant, so can't lock a mutext which is already locked.To do that may cause deadlock. ex: lock in outer method and try to lock again in inner method

- In order to prevent deadlock, need have two kinds of method. Exported method acquire lock, private method assume mutex already locked
