Mutex即互斥锁。在北美的一些小办公室,常常能见到很小的男女公用的洗手间,这种洗手间只有一把钥匙,只有拿到了这个钥匙的人才可以进入洗手间。用完洗手间后,此人将钥匙释放,等待队列中的第一个人才可以获取钥匙进入洗手间。在这里,钥匙是mutex, 洗手间是不能被并行访问的受保护资源,Mutex只能被获取者释放。在java中,一般用synchronized(某个对象锁)来保证一段代码不会被并行运行。如果一个方法加了synchronized关键字,那么一个线程只有获取了该对象的对象锁才能执行这个方法,它等同于 fun() { synchronized(this) {...}}
Semaphore则可以看成那种普通的洗手间。当洗手间满了,其他人就只能在外面等待。semaphonre最常见的用途是生产者-消费者场景。例如一个消息队列,经常会使用两个信号量,一个信号量指示消息队列是否满了,另一个指示消息队列是否空的。当多个producer往消息队列中put消息,并指示empty信号量为可用。一旦消息队列满了,full信号量能保证producer不再往队列中Put消息。consumer则get消息,并指示full信号量可用。一旦队列中不再有消息,empty信号量保证consumer不再get消息。信号量与Mutex最大的不同是,Mutex只能被acquire它的线程release, 可semaphore可以被不同的线程release