关于5-1flag判断问题,请老师解答一下

来源:5-1 线程间通信

Mitsushima_Hikari

2018-07-31 22:58:10

老师的原话是“当flag为false,也就是没有数字的时候要等待”

而在变量定义的时候就已经定义了  flag=false了

所以在get()方法中,应该写成if(flag)当没有数字的时候,需要等待。

老师写的是if(!flag),那这么理解的话 岂不是变成了 消费时,里面有数字时需要进行等待?

下面的set方法同样的问题,我就不多赘述了。我把老师代码,和我的代码贴出来对比一下,还请老师可以指出我的问题,绕的有点晕

老师视频中的代码:http://img.mukewang.com/climg/5b6078870001df9b04710488.jpg

视频中老师说的是if(!flag)为false,可是不应该为这里如果是!flag不是为true了吗?

下面是我的代码:

public class Queue {
	private int n;
	boolean flag = false;

	public synchronized int get() {
		if (flag) {
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		System.out.println("消费:" + n);
		flag = true;
		notifyAll();
		return n;
	}

	public synchronized void set(int n) {
		if (!flag) {
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		System.out.println("生产:" + n);
		this.n = n;
		flag = false;
		notifyAll();
	}

}


写回答

1回答

Tender10

2018-08-01

get、set是一个同步方法,首先flag是false,这时候get方法检测if(!flag)就是true,就会进行等待,不能直接消费,等待什么呢,等待set方法的生产。而set方法if(flag)是flase,不需要执行等待过程,直接进行生产,生产完以后flag变成true,这个时候get方法判断if(!flag)就为flase不需要等待,可以消费,消费完flag设置为false。所以就实现了生产一次消费一次的模式。

0
hitsushima_Hikari
回复
hender10
h 谢谢老师!
h018-08-01
共3条回复

0 学习 · 7235 问题

查看课程