等待后解锁如何发生

问题描述

我写了一个小程序来交替打印奇偶数,但是有一个问题:

由于线程应在await调用中等待,因此可重入锁定如何被解锁?

public class Worker implements Runnable
{
    private reentrantlock rLock = null;
    private Condition condition = null;
    private String name;
    volatile static boolean isEvenTurn = true;
    
    public Worker(String name,reentrantlock rLock,Condition condition)
    {
        this.name = name;
        this.rLock = rLock;
        this.condition = condition;
    }
    
    @Override
    public void run() 
    {
        try
        {
            if(name.equals("ODD"))
                printOdd();
            else
                printEven();
        }
        catch(Exception e) { e.printstacktrace();}
        
    }
    
    private void printOdd() throws Exception
    {
        while(isEvenTurn);
        for(int i=1;i<10;i+=2)
        {
            try
            {
                rLock.lock();
                System.out.println(i);
            }
            catch(Exception e) {e.printstacktrace();}
            finally
            {
                condition.signal();
                condition.await();
                rLock.unlock();
            }
        }
    }
    
    private void printEven() throws Exception
    {
        for(int i=0;i<10;i+=2)
        {
            try
            {
                rLock.lock();
                System.out.println(i);
                isEvenTurn = false;
            }
            catch(Exception e) {e.printstacktrace();}
            finally
            {
                condition.signal();
                condition.await();
                rLock.unlock();
            }
        }
    }
    
    public static void main(String[] args) 
    {
        reentrantlock rLock = new reentrantlock();
        ExecutorService service = Executors.newFixedThreadPool(2);
        
        Condition c = rLock.newCondition();
        Worker oddPrinter = new Worker("ODD",rLock,c);
        Worker evenPrinter = new Worker("EVEN",c);
        
        service.execute(evenPrinter);
        service.execute(oddPrinter);
        
        service.shutdown();
    }
}

解决方法

在printEven()方法中,添加以下行:在finally块中:

       finally
        {
            condition.signal();
            if(i < 10)condition.await(); 
            rLock.unlock();
        }

通过添加此条件,当您的 我= 10,您的线程将不再等待。