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

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

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

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

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

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

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

老师视频中的代码:http://img1.sycdn.imooc.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回答

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

  • Mitsushima_Hikari 提问者 #1
    谢谢老师,说的很详细,还有个小问题想问你。如这道例题,对于同一个对象来说,如果两个线程都加同步锁(synchronized )了,并且都调用了wait 方法,是不是当其中一个线程调用wait的时候就会执行另一个线程?当前的锁会被释放掉?
    2018-08-01 11:52:44
  • Tender10 回复 提问者 Mitsushima_Hikari #2
    等待的时候线程进入到该对象的等待池中,当前的锁会释放
    2018-08-01 13:44:11
  • Mitsushima_Hikari 提问者 回复 Tender10 #3
    谢谢老师!
    2018-08-01 14:28:22
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师