2011-03-07 49 views
0

如果线程A访问线程B的方法,恰好在等待一个条件,线程A会被卡住在该方法中吗?我怎么能这样做,线程A可以实际检查线程B是否正在等待条件,并因此被条件暂停,并在线程B完成时通过线程B的条件发出信号?监视器和锁问题

基本上,我想知道如何防止嵌套条件阻止调用嵌套调用(线程间)的父方法。

例如:

import java.util.concurrent.locks.Condition; 
import java.util.concurrent.locks.Lock; 
import java.util.concurrent.locks.ReentrantLock; 

public class Person { 

    final Lock lock = new ReentrantLock(); 
    Condition isFree = lock.newCondition(); 
    State state; 

    public void eat() throws InterruptedException { 
     lock.lock(); 
     try { 
     while (state != State.WAITING) { 
      isFree.await(); 
     } 

     //begin eating 
     state = State.EATING; 
     Thread.sleep(1000); 
     state = State.WAITING; 
     isFree.signal(); 

     } finally { 
     lock.unlock(); 
     } 
    } 

    public void feed(Person person) throws InterruptedException { 
     lock.lock(); 
     try { 

     while (state != State.WAITING) { 
      isFree.await(); 
     } 

     //begin intention to feed 
     person.eat(); 

     } finally { 
     lock.unlock(); 
     } 
    } 

    enum State { 
     EATING, WAITING; 
    } 
} 

在上述例子中,它可能是发生每一Person对象是喂养另一个,从而被卡在一个争用条件。

谢谢!

回答

1

看看java.util.concurrent.locks.Lock上的tryLock()方法。这使您可以尝试获取锁,但如果失败则返回(在可选超时之后),而不是阻塞。

1

@Matt McHenry的回答为您提供了解决此问题的可能方法。

但是,您需要小心谨慎,不要只用潜在的livelock替代潜在的死锁。

IMO,最好将您的应用程序设计为无死锁,而不是使用以下方法减轻死锁:tryLock(...)