public class CSemaphore { int value; BinarySemaphore mutex = new BinarySemaphore(true); BinarySemaphore s = new BinarySemaphore(false); public CSemaphore(int initValue) { value = initValue; } public void P() { mutex.P(); value--; while (value < 0) { mutex.V(); s.P(); mutex.P(); } mutex.V(); } public void V() { mutex.P(); value++; if (value <= 0) s.V(); mutex.V(); } }