java多线程中的notify()唤醒问题

IMWHO 发布于 2015/05/08 20:18
阅读 933
收藏 0
package demo;

class Resource{
	private String name;
	private int count = 1;
	private boolean flag = false;
	public synchronized void set(String name){
		if(flag){
			try{wait();}catch(InterruptedException e){}
		}else{
			this.name = name + count;
			count++;
			System.out.println(Thread.currentThread() + this.name + "--------------生产者");
			flag = true;
			notify();
		}
	}
	public synchronized void out(){
		if(!flag){
			try{wait();}catch(InterruptedException e){}
		}else{
			System.out.println(Thread.currentThread() + this.name + "------消费者");
			flag = false;
			notify();
		}
	}
}

class Producer implements Runnable {
	private Resource r;
	public void run(){
		while(true){
			r.set("烤鸭");
		}
	}
	public Producer(Resource r){
		this.r = r;
	}
}

class Customer implements Runnable {
	private Resource r;
	public void run(){
		while(true){
			r.out();
		}
	}
	public Customer(Resource r){
		this.r = r;
	}
}


public class SynDemo {

	public static void main(String[] args) {
		Resource r = new Resource();
		Producer pro = new Producer(r);
		Customer cus = new Customer(r);
		Thread t0 = new Thread(pro);
		Thread t1 = new Thread(pro);  Thread t2 = new Thread(cus); Thread t3 = new Thread(cus);
		t0.start();
		t1.start();
		t2.start();
		t3.start();
	}}

比如在Resource的set方法中t0执行到if语句判断真,wait,释放执行权,t2或t3运行,使flag变为false,然后,t1执行唤醒了t0,此时是不是t0和t1都在set方法中,这不就与synchronized违背了吗?

新手提问,希望大神能解答一下,谢谢!



加载中
0
水至浅
水至浅

首先,你这个程序,如果每个方法去掉 while(true) ,会有一直wait();的可能性。

然后同一个时刻只会有一个synchronized方法执行,不可能会有两个set同时运行。

notify();只会唤醒某一个wait。

唤醒后,同一时间只会执行这一个synchronized方法,而其它的是不会执行的。

0
notreami
notreami
这个线程不是顺序执行额~~~所以t0也不一定就首先执行。。
IMWHO
IMWHO
可是有这个可能啊, 我刚想是不是t0被唤醒后只是具备执行资格,必须在t1释放执行权后,t0才能继续执行,就是说t0虽然继续上次执行,但t0重新获得锁,与上次没有关系了。
返回顶部
顶部