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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

//使用继承的这种方式实现多线程,加了锁了但是还是出现了同一张票被多个窗口卖的情况呀,何解????代码只提供Mythread类
package cn.itcast3;

class MyThread extends Thread {
        // 构造方法
        MyThread() {
        }

        MyThread(String name) {
                super(name);

        }

        private static int num = 10;
        Object obj = new Object();

        public void run() {
                while (true) {
                        synchronized (obj) { // 加锁了,一次还是卖三张?????????????????????
                                if (num > 0) {
                                        try {
                                                Thread.sleep(10);
                                        } catch (InterruptedException e) {
                                                // e.printStackTrace();
                                        }
                                        System.out.println(getName() + "正在出售" + (num--) + "张票");

                                } else {
                                        System.out.println("没票了!");
                                        break;
                                }
                        }
                }
        }
}

2 个回复

倒序浏览
  synchronized (obj) ; 每个线程的锁不一样啊 , 应该用同一把锁,比如   synchronized (MyThead.class)
回复 使用道具 举报
你看这个使用实现接口的方式写的.锁对象是obj就没问题啊,而且变量num也不用修饰.
class MyRunnable implements Runnable {
        int num = 100;
        Object o = new Object();
        public void run() {
                while (true) {
                        synchronized(o){   //锁对象也可以是this 或 MuRunnable.class
                          if (num > 0) {
                                  try {
                                        Thread.sleep(5);
                                } catch (InterruptedException e) {
//                                        e.printStackTrace();
                                }
                          System.out.println(Thread.currentThread().getName() + "正在出售第 "+ num-- + "张票");
                          }else{           //????  V
                                  System.out.println("没票了!");
                                  break;

                        }
                 }
          }
   }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马