风言枫语  

public class SemaphoreOnLock
{
    private final Lock lock = new ReentrantLock();
   
    private final Condition permitsAvailable = lock.newCondition();
   
    private int permits;
   
    SemaphoreOnLock(int initialPermits)
    {
        lock.lock();
       
        try
        {
            permits = initialPermits;
        }
        finally
        {
            lock.unlock();
        }
    }
   
    public void acquire()
        throws InterruptedException
    {
        lock.lock();
       
        try
        {
            while (permits <= 0)
            {
                permitsAvailable.await();
            }
           
            --permits;
        }
        finally
        {
            lock.unlock();
        }
    }
   
    public void release()
    {
        lock.lock();
       
        try
        {
            ++permits;
            permitsAvailable.signal();
        }
        finally
        {
            lock.unlock();
        }
       
    }
}

posted on 2013-08-31 23:50  风言枫语  阅读(188)  评论(0)    收藏  举报