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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 知行 中级黑马   /  2013-6-13 11:41  /  1635 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 知行 于 2013-6-14 22:57 编辑
  1. package com.heima.thread;

  2. public class ThreadSafe {

  3.         /**
  4.          * @param args
  5.          */
  6.         public static void main(String[] args) {
  7.             //4)创建Tikets实例
  8.                 Tikets tk = new Tikets();
  9.                 //3) 创建线程实例
  10.                 Thread t1 = new Thread(tk,"线程1");
  11.                 Thread t2 = new Thread(tk,"线程2");
  12.                 Thread t3 = new Thread(tk,"线程3");
  13.                  
  14.                 //5)启动线程
  15.                 t1.start();
  16.                 t2.start();
  17.                 t3.start();
  18.         }

  19. }
  20. //1)定义一个类并且实现Runnable接口
  21. class Tikets implements Runnable
  22. {
  23. int tiketsNum = 100;
  24. //2)复写run方法        
  25. @Override
  26.         public void run() {
  27.                  while(tiketsNum>0){
  28.                                 System.out.println(Thread.currentThread().getName()+"卖出"+tiketsNum--);
  29.                 }
  30.          }
  31.         
  32. }
复制代码
帮我分析(结果)一下出现两个100的情况:
线程2卖出100
线程1卖出100
线程1卖出98
线程1卖出97
线程2卖出99
线程1卖出95
线程3卖出96
线程1卖出93
线程2卖出94
线程1卖出91
线程3卖出92

难道是System.out.println(Thread.currentThread().getName()+"卖出"+tiketsNum--);只是打印了而没有进行自减操作?

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 神马都是浮云

查看全部评分

10 个回复

倒序浏览
当打印 线程2 的时候,还没自减,然后线程1 获得运行权,。
回复 使用道具 举报
因为tiketsNum--是后置的自减运算,后置时是先使用后计算;并且在线程代码中没有加同步锁。
根据结果看,有可能是线程2执行时,获取到了tiketsNum的值100,但还没有执行自减的操作,此时线程1获取到了执行权,也打印出了tiketsNum=100。
如下例:
  1. public class Test01 {
  2.     /**
  3.      * @param args
  4.      */
  5.     public static void main(String[] args) {
  6.         //4)创建Tikets实例
  7.             Tikets tk = new Tikets();
  8.             //3) 创建线程实例
  9.             Thread t1 = new Thread(tk,"线程1");
  10.             Thread t2 = new Thread(tk,"线程2");
  11.             Thread t3 = new Thread(tk,"线程3");
  12.             
  13.             //5)启动线程
  14.             t1.start();
  15.             t2.start();
  16.             t3.start();
  17.     }

  18. }
  19. //1)定义一个类并且实现Runnable接口
  20. class Tikets implements Runnable
  21. {
  22. int tiketsNum = 100;
  23. //2)复写run方法        
  24.     public void run() {
  25.              while(tiketsNum>0){
  26.                  try {
  27.                                         System.out.println(Thread.currentThread().getName()+"卖出"+tiketsNum);
  28.                                         Thread.sleep(1);//线程1执行到此处时,线程2获取到执行权,tiketsNum并没有自减。
  29.                                         tiketsNum--;
  30.                                 } catch (InterruptedException e) {
  31.                                         e.printStackTrace();
  32.                                 }
  33.             }
  34.      }
  35. }
复制代码
运行结果:
线程1卖出100
线程2卖出100
线程3卖出100
线程1卖出99
线程3卖出97
线程2卖出98

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
尹桥印 发表于 2013-6-13 11:53
没加锁。把视频往后多看看就明白是怎么回事了。

没加锁我知道,毕老师分析的是出现0和-1的情况,但是现在这个是出现了两个100
回复 使用道具 举报
桉树 发表于 2013-6-13 11:58
当打印 线程2 的时候,还没自减,然后线程1 获得运行权,。

我也是这么想的,就是不确定  谢了
回复 使用道具 举报
funneies 发表于 2013-6-13 14:55
因为tiketsNum--是后置的自减运算,后置时是先使用后计算;并且在线程代码中没有加同步锁。
根据结果看,有 ...

恩恩 ,谢谢了
回复 使用道具 举报
问题已经解决的,请及时更改分类为已解决,方便大家查阅,没有的继续追问
关于提问技巧请看:http://bbs.itheima.com/thread-53229-1-1.html
回复 使用道具 举报
楼主你好  如果帖子的问题已解决,请把帖子的类型改为已解决,如果没解决请继续追问。
回复 使用道具 举报
知行 中级黑马 2013-6-14 22:40:01
9#
袁梦希 发表于 2013-6-14 18:08
楼主你好  如果帖子的问题已解决,请把帖子的类型改为已解决,如果没解决请继续追问。 ...

我不会改啊  ,能不能教教我啊
回复 使用道具 举报
知行 发表于 2013-6-14 22:40
我不会改啊  ,能不能教教我啊

点击自己帖子下面有个编辑   然后有个帖子的类型  上面有下拉菜单  有个已解决
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马