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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 笑轻轻 中级黑马   /  2014-8-11 11:21  /  867 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class xian2 extends Thread{
         static int i=500;
        Object o=new Object();
        public void run(){
                while(i>0){
                        //如果i=2时停,被另一个线程执行一遍后该线程该线程如果没有判断继i值续执行。则会结果输出0.
                        System.out.println(this.getName());//假设:在双核以上的电脑中多个java进程同时执行。若是多个执行的进程速度不一样则此段代码会发生问题。
                        synchronized(o){
                                if(i>0)
                        System.out.println(this.getName()+"------卖出第"+i--+"张票");
                        }
                }
        }
}

//上面代码按要求当多个进程执行时,会从按顺序输出500到1。但是执行时输出顺序会错乱。为什么

3 个回复

倒序浏览
因为每个线程的锁不一样,synchronized实际上没有起到约束作用,要把Object o=new Object();改为静态
回复 使用道具 举报
fantacyleo 发表于 2014-8-11 11:23
因为每个线程的锁不一样,synchronized实际上没有起到约束作用,要把Object o=new Object();改为静态 ...

我把要把Object o=new Object();改为静态了还是出现顺序错乱
回复 使用道具 举报
笑轻轻 发表于 2014-8-11 12:50
我把要把Object o=new Object();改为静态了还是出现顺序错乱


  1. public class Test extends Thread{
  2.     static int i=500;
  3.     static Object o=new Object();
  4.     public void run(){
  5.             while (i > 0) {
  6.             synchronized(o){
  7.                     if (i>0)
  8.                             System.out.println(this.getName()+"------卖出第"+i--+"张票");
  9.                     }
  10.             }
  11.     }
  12.    
  13.     public static void main(String[] args) {
  14.             for (int i = 0; i < 5; i++)
  15.                     new Test().start();
  16.     }
  17. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马