我有一个简单的程序来测试条件如下:
public class ThreadTest2 {
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
public void conditionWait() throws InterruptedException {
lock.lock();
try {
System.out.println("1");
condition.await();
System.out.println("2");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void conditionSignal() throws InterruptedException {
lock.lock();
try {
System.out.println("3");
condition.signal();
System.out.println("4");
} finally {
lock.unlock();
}
}
public static void main(String[] args) throws InterruptedException {
ThreadTest2 test = new ThreadTest2();
test.conditionWait();
Thread.sleep(2000);
test.conditionSignal();
}
}
结果是:1, 似乎conditionWait()方法已经采取了锁定,因此conditionSignal()方法无法获取它。然而,如果我改变程序以在每个方法中使用线程:
public class ThreadTest2 {
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
public void conditionWait() throws InterruptedException {
new Thread() {
public void run() {
lock.lock();
try {
System.out.println("1");
condition.await();
System.out.println("2");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
lock.unlock();
}
};
}.start();
}
public void conditionSignal() throws InterruptedException{
new Thread() {
public void run() {
lock.lock();
try {
System.out.println("3");
condition.signal();
System.out.println("4");
} finally {
lock.unlock();
}
};
}.start();
}
public static void main(String[] args) throws InterruptedException {
ThreadTest2 test = new ThreadTest2();
test.conditionWait();
Thread.sleep(2000);
test.conditionSignal();
}
}
结果是:1 3 4 2,那么它们之间有什么区别,为什么使用线程可以得到锁,而没有线程不能
答案 0 :(得分:1)
在conditionWait
中,您可以使用锁定,等待获取该条件。这确实会暂时释放锁,但它仍然可能永远等待。
wait
完成的唯一方法是发出信号。如果你在等待,信号会从哪里来?仅来自另一个帖子。但是没有其他线程所以这将永远等待。