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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曾祥旭 中级黑马   /  2013-3-26 19:13  /  1500 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 曾祥旭 于 2013-3-27 06:34 编辑

class Ticket implements Runnable{
private int tick=100;
public void run(){
  while(true){
   if(tick>0){
   
    System.out.println(Thread.currentThread().getName()+"--"+tick--);
   }
   
  }
}
}
public class Test{
public static void main(String[] args){
  Ticket t=new Ticket();
  Thread t1=new Thread(t);
  Thread t2=new Thread(t);
  Thread t3=new Thread(t);
  Thread t4=new Thread(t);
  t1.start();
  t2.start();
  t3.start();
  t4.start();
}
}
在上述代码中,有四个线程对tick进行操作,当Thread-0线程中的tick为1的时候,此时切换到Thread-1号线程的时候,为什么tick的也为1,这个1不是给Thread-0线程使用了吗?

点评

如果你的问题已经得到解决后,请及时将主题贴类型改为 [已解决] ,如还有问题可继续追问。  发表于 2013-3-27 04:49

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

4 个回复

倒序浏览
涉及到线程同步的问题了.....

你这个现象可以这么解释:

当Thread-0执行 t-- ,还没自减时,Thread-1刚好读取了t的值.
Thread-0打印输出1,那么Thread-1也刚好打印输出1;

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

回复 使用道具 举报
楼主你好    这道题涉及了线程安全方面的知识。

首先这段代码开启了四个线程执行run方法中的代码,线程本身是随机的

假设tick=1时,当cpu执行Thread-0(线程0)时,tick=1进入run方法,满足if条件,线程0没等输出呢,线程0被的执行权被线程1(当然线程2,线程3也可以抢走,你这里指的是线程0和线程1的问题,我们只是假设)抢走了。线程0只具备执行资格,而执行权被线程1抢去了,线程1没等输出呢,线程2也可能会以此类推。

所以当他们同时具备执行权的时候,就会同时输出,也就是你说的打印相同的1。

由此引出了以后要学习的同步知识。

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

回复 使用道具 举报
你这线程代码没有同步,当多个线程在执行时,实际就是在抢CPU的执行权而已,当0线程运行 刚过if判断就失去了执行资格,
这时线程1 开始运行,同样 满足if判断  然后打印 ,
这时 线程0在打印 打印 ,
所以当多线程访问共享数据时,一定要加锁

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 HM朱蛟 于 2013-3-27 04:03 编辑

楼主你好  

我用你的代码 在我这里运行了多次   没有出现过楼主所说的    2个线程为同一数值的情况  即 Thread-0 / Thread-1 都为同一个数值的情况

你在if里面加一条这个     try{Thread.sleep(10);}  catch(Exception e){}  现象应该会比较明显一点

   if(tick>0)
   {
           
    try{Thread.sleep(10);}  catch(Exception e){}

    System.out.println(Thread.currentThread().getName()+"--"+tick--);
   }

原理就是上面几位说的那样

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

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