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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗磊 中级黑马   /  2012-8-20 15:11  /  1191 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 罗磊 于 2012-8-20 15:14 编辑

class Tisk2 implements Runnable{
int tisk = 10000;
public synchronized  void run(){//为了简化代码  我把判断条件提到 while里 于是
  while(tisk>0){//这里出现了安全隐患   所以我想加锁  可是加那呢?
                      //如果加在函数上 就是只有一个线程运行啦 !而且运行结果是下面的结果是从5794开始!
                     //而加代码块!虽然可以多线程,但也有安全隐患!而且是从5790开始!且有负票!
                    //我想这也就是毕老师说的为什么这里条件要用true的原因吧 !
                   //但我想如果我非要这么做 然后出现这种结果怎么处理呢?
    System.out.println(Thread.currentThread().getName()+"....."+tisk--);
   
  }
}
public static void main(String[] args) {
Tisk2 t= new Tisk2();
Thread th1 = new Thread(t,"th1");
Thread th2 = new Thread(t,"th2");
Thread th3=  new Thread(t,"th3");
Thread th4 = new Thread(t,"th4");
Thread th5 = new Thread(t,"th5");
Thread th6 = new Thread(t,"th6");
th1.start();
th2.start();
th3.start();
th4.start();
th5.start();
th6.start();
}
}
加在函数上的运行结果:
th2.....5794
th2.....5793
th2.....5792
th2.....5791
th2.....5790
th2.....5789
th2.....5788
th2.....5787...我就不多截图了 ,反正是从5794开始(为什么是这样?) 而且一直是2线程 然而 我把int改为1000时又能从1000开始运行 但也是2线程在走 这里我就不解了!请帮忙解释下

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

1 个回复

倒序浏览
class Tisk2 implements Runnable
{
    int tisk = 10000;

    public void run() //最开始的代码,你将synchronized加到run()方法上,由于里面有个判断while(Tisk>0),所以一直执行的是同一个线程,while不判断完不罢休,呵呵    {
                while (true)
                {
                        synchronized(Tisk2.class) //出现负数的情况是由于线程与线程之间的执行次序,有些线程还没执行完,其实其他线程已经执行了一部分,
                        //所以需要加上synchronized代码块!并才用双重判断,类似与单例设计模式一样!

                        {
                           if (tisk>0)
                           {
                                System.out.println(Thread.currentThread().getName()+"....."+tisk--);
                           }
                           else
                                    break;
                        }
                }
    }
    public static void main(String[] args)
    {
     Tisk2 t= new Tisk2();
     Thread th1 = new Thread(t,"th1");
     Thread th2 = new Thread(t,"th2");
     Thread th3=  new Thread(t,"th3");
     Thread th4 = new Thread(t,"th4");
     Thread th5 = new Thread(t,"th5");
     Thread th6 = new Thread(t,"th6");
     th1.start();
     th2.start();
     th3.start();
     th4.start();
     th5.start();
     th6.start();
    }
}

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 赞一个!

查看全部评分

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