A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吃阁子的猫 中级黑马   /  2013-9-9 14:29  /  1370 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 吃阁子的猫 于 2013-9-13 14:20 编辑

class Print{
private int flat = 1;
public synchronized void print1() throws Exception{
  while (flat!=1) {
   wait();
  }
  System.out.print("传");
  System.out.print("智");
  System.out.print("播");
  System.out.print("客");
  System.out.println();
  notifyAll();
  flat = 2;
}
public synchronized void print2() throws Exception{
  while (flat!=2) {              //即使再判断,也是让本线程等待,其他2个都被唤醒,不也是随机执行一个线程吗,与用 if 判断有什么区别呢?
   wait();
  }
  System.out.print("黑");
  System.out.print("马");
  System.out.print("程");
  System.out.print("序");
  System.out.print("员");
  System.out.println();
  notifyAll();
  flat = 3;
}
public synchronized void print3() throws Exception{
  while (flat!=3) {
   wait();
  }
  System.out.print("c");
  System.out.print("s");
  System.out.print("d");
  System.out.print("n");
  System.out.println();
  notifyAll();
  flat = 1;
}
}

6 个回复

倒序浏览
对于你的问题:
while (flat!=2) {              //即使再判断,也是让本线程等待,其他2个都被唤醒,不也是随机执行一个线程吗,与用 if 判断有什么区别呢?
   wait();
  }
while循环:如果条件满足,就执行,不满足就一直循环判断。
if()判断语句,当调的时候只执行一次,不管条件不满足或者满足。
这下明白了吗?
回复 使用道具 举报
mo﹎雲℡ 发表于 2013-9-9 14:57
对于你的问题:
while (flat!=2) {              //即使再判断,也是让本线程等待,其他2个都被唤醒,不也是随 ...

不明白不明白
回复 使用道具 举报
使用if语句时
    wait();语句只会执行一次,而执行一次程序有错也可能不会暴露出来
但使用while语句时
    wait()语句会被多次执行,在执行的过程中如果程序有错会充分的暴露出来。这样就可以保证线程的安全性。
回复 使用道具 举报
陶智第 发表于 2013-9-9 22:57
使用if语句时
    wait();语句只会执行一次,而执行一次程序有错也可能不会暴露出来
但使用while语句时

是啊,这样不是就让本线程等待了,但是可能会切到其他任意2条线程上啊,但是结果是它确实是按顺序执行的
回复 使用道具 举报
麻烦你把完整的代码拉上来。这样的话也不知道你是几个线程,怎么调用的。
回复 使用道具 举报
这个程序好像有点问题
同步是指同一时间段只有一个线程在执行
而这个程序当flat为1时,有两个方法可供选择
也就是说,如果多个线程进入的话,可能有多个线程在同一段时段中执行,那么它们就不可能使用同一个锁。而这违背了同步的原理
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马