黑马程序员技术交流社区
标题:
请帮我分析下,this.notify换成notify后结果不同的原因
[打印本页]
作者:
freeboyhrk
时间:
2013-4-6 10:51
标题:
请帮我分析下,this.notify换成notify后结果不同的原因
本帖最后由 freeboyhrk 于 2013-4-6 10:57 编辑
class ProducerConsumerDemo
{
public static void main(String[] args)
{
Resource r = new Resource();
Producer pro = new Producer(r);
Consumer con = new Consumer(r);
Thread t1 = new Thread(pro);
Thread t2 = new Thread(pro);
Thread t3 = new Thread(con);
Thread t4 = new Thread(con);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class Resource
{
private String name;
private int count = 1;
private boolean flag = false;
public synchronized void set(String name)
{
while(flag)
try{this.wait();}catch(Exception e){}
this.name = name+"--"+count++;
System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);
flag = true;
this.notify();
}
public synchronized void out()
{
while(!flag)
try{wait();}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"...消费者........."+this.name);
flag = false;
this.notify();
}
}
class Producer implements Runnable
{
private Resource res;
Producer(Resource res)
{
this.res = res;
}
public void run()
{
while(true)
{
res.set("+商品+");
}
}
}
class Consumer implements Runnable
{
private Resource res;
Consumer(Resource res)
{
this.res = res;
}
public void run()
{
while(true)
{
res.out();
}
}
}
复制代码
作者:
郭利超
时间:
2013-4-6 10:53
啥问题啊
作者:
谢达
时间:
2013-4-6 14:00
this.notify()与notify()这是一样的吧..运行结果不会因为这里产生差别,
作者:
freeboyhrk
时间:
2013-4-7 21:09
谢达 发表于 2013-4-6 14:00
this.notify()与notify()这是一样的吧..运行结果不会因为这里产生差别,
我这里运行有区别的,你可以复制运行下,运行时间不一样
作者:
陈中岩
时间:
2013-4-8 06:58
this.notify()与notify()的运行结果是一样的,函数需要被对象调用。那么函数都有一个所属对象引用。就是this
你多试几次,就会得到你想要的这个死锁的结果了。
不过,这个例子我记得应该是notifyAll();否则肯定会出现死锁的。由于CPU切换,仅使用notify();会导致解锁不完全,有可能对方的锁并没有解开,也锁在其中一个函数里了。
作者:
陈中岩
时间:
2013-4-8 06:59
this.notify()与notify()的运行结果是一样的,函数需要被对象调用。那么函数都有一个所属对象引用。就是this
你多试几次,就会得到你想要的这个死锁的结果了。
不过,这个例子我记得应该是notifyAll();否则肯定会出现死锁的。由于CPU切换,仅使用notify();会导致解锁不完全,有可能对方的锁并没有解开,也锁在其中一个函数里了。
作者:
黄玉昆
时间:
2013-4-8 08:39
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
作者:
saghir
时间:
2015-4-25 15:10
等待线程都存在线程池中的线程,notify通常唤醒第一个等待的线程。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。不使用notify,此处应该不影响代码块的运行,为什么不一样,还有待研究(程序执行时没找到入口)。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2