notify,wait,3个以上线程的时候出现的一个问题

HYbdbc 2012-10-29 04:42:56
首先线程
public class TestThread11 {   
private static Object lock = new Object();
public void execute(){ // synchronized修饰
synchronized(lock){
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
if(i == 5){
try {
lock.wait();
System.out.println(Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
lock.notify();
}
}
}
}


再来
class ThreadAA implements Runnable {   
public void run() {
TestThread11 test = new TestThread11();
test.execute();
}

public static void main(String[] args)
{
Runnable runabble=new ThreadAA();
Thread a=new Thread(runabble,"A");
a.start();
Thread b=new Thread(runabble,"B");
b.start();
Thread c=new Thread(runabble,"C");
c.start();
}
}


2个线程的时候 还好说一个线程肯定会调用notify,另外一个线程的肯定会被唤醒。
但是如果3个以上的线程时,就有可能线程A 调用wait后,线程B调用notify,然后wait释放锁后,线程A继续运行完,然后会notify线程B继续运行完,在这过程,线程C可能一直都不会运行,但是线程A,B都运行完了,线程Cwait后 就没有线程来唤醒它了,导致死锁。这问题怎么解决?
...全文
149 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
nmyangym 2012-10-30
  • 打赏
  • 举报
回复
创建并启动偶数个这样的线程,都没问题. 奇数个线程存在这样的问题.
ciltr 2012-10-30
  • 打赏
  • 举报
回复
改为notifyAll就不会有问题了。
zxhcloth 2012-10-29
  • 打赏
  • 举报
回复
完全解决是不大可能,因为你这设计,就注定会有这个问题。
不过可以帮你降低出现死锁的概率,将lock.notify();更改为lock.notifyAll();

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧