本帖最后由 王瀛 于 2013-5-31 11:06 编辑
rt,刚学完等待唤醒机制(day12-03)
写了个资源为单例模式的代码,能正常运行。但是对于其中的 if语句判断资源状态那里不是很明白。
毕老师视频中的是:初始化资源的标记为flase,并且对于Input和Output的判断语句分别是 if(资源对象.flag) 和 if(!(资源对象.flag)) , 这两个判断语句怎么理解?
下面是我自己写的,if判断语句部分按照我自己写的和按照毕老师的写法都可以正常运行,但是不理解毕老师代码所表示的意思,求解释~- class Student//单例模式保证操作唯一对象(同一资源)
- {
- String name;
- String sex;
- int grade;
- private Student(){}
- private static final Student s = new Student();
- public static Student getInstance()
- {
- return s;
- }
- boolean flag = false;//定义一个状态标记
- }
- class Input implements Runnable//Input实现Runnable接口
- {
- Student sin = Student.getInstance();//获得Student实例对象的引用
- public void run()//复写run方法
- {
- int x = 0;//定义状态初始值
- int a = 0;
- while (a<30)//控制循环次数
- {
- synchronized(sin)//加锁,并为了验证单例,刻意在Input和Output中起不同的引用名=。=
- {
- if (sin.flag==true)//判断资源状态<================这里毕老师写的是if(sin.flag)不明白为什么
- try
- {
- sin.wait();//如果资源里面有东西就等待
- }
- catch (Exception e)
- {
- }
- if (x==0)
- {
- sin.name = "李雷";
- sin.sex = "male";
- sin.grade = 1;
- }
- else
- {
- sin.name = "韩梅梅";
- sin.sex = "女女女女女女";
- sin.grade = 2;
- }
- x = (x+1)%2;//用数值代表性别,控制交替执行
- System.out.println("传入::::"+sin.name+"......"+sin.sex+"......"+sin.grade+"年级......"+a);
- sin.flag = true;//执行后(input后),将资源状态量改变为true
- sin.notify();//唤醒
- }
- a++;
- }
- }
- }
- class Output implements Runnable//Output实现Runnable接口
- {
- Student sou = Student.getInstance();//获得Student实例对象的引用,由于Student使用了单例模式,所以与Input中的sin指向的是同一个对象。
- public void run()//复写run方法
- {
- int a = 0;
- while (a<30)
- {
- synchronized(sou)//同步锁
- {
- if (sou.flag==false)//判断资源状态,如果里面没有东西就等待<================这里毕老师写的是if(!(sou.flag))不明白为什么
- try
- {
- sou.wait();
- }
- catch (Exception e)
- {
- }
- System.out.println("传出::::"+sou.name+"~~~~~~"+sou.sex+"~~~~~~"+sou.grade+"年级~~~~~~"+a);
- sou.flag = false;//输出后将资源状态切换为false
- sou.notify();//唤醒
- }
- a++;
- }
- }
- }
- class InputOutputDemo
- {
- public static void main(String[] args)
- {
- new Thread(new Input()).start();
- new Thread(new Output()).start();
- }
- }
复制代码 |