该程序的输出如下:
00123123456456789789
从而证实了我的猜测。
作为对比,下面是采用synchronized关键字的互斥锁方案:
该程序的输出如下:
01234567890123456789
可见两个线程确实互斥运行。
这个问题产生的原因是虽然在Mutex的定义中"private Semaphore s = new Semaphore(1)",也就是该信号量的初始permits是1,但是在此后每次调用release方法都会导致permits加一。如果能限制permits最大值1,最小值0,那就是真正的Mutex了。