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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

“卖票”这个问题需要同步线程,同步线程可以使线程1和线程2共享资源,你可以使用synchronized关键字进行同步,或者使用Lock类,来进行同步。
回复 使用道具 举报
其实这个就是因为运算符优先级的问题。+count--的时候因为打印的优先级比运算的优先级要高,所以是先打印,后运算,在打印过程中线程2进入,导致count的值重复,要解决也很简单将count--的优先级提升用括号括起来先运算在打印重复的现象就不容易出现了。我基本没出现过重复的。。
  1. class ticket implements Runnable {
  2.         private int count = 100;

  3.         public void run() {
  4.                 while (count > 0) {
  5.                         
  6.                         System.out.println(Thread.currentThread().getName() + "卖出票"
  7.                                         + (count--));
  8.                         try {
  9.                                 Thread.sleep(50);
  10.                         } catch (InterruptedException e) {
  11.                                 // TODO Auto-generated catch block
  12.                                 e.printStackTrace();
  13.                         }
  14. //                        count--;
  15.                 }

  16.         }

  17. }

  18. public class ticketDemo {

  19.         public static void main(String[] args) {

  20.                 ticket t = new ticket();
  21.                 Thread thread1 = new Thread(t, "线程1");
  22.                 Thread thread2 = new Thread(t, "线程2");
  23.                 thread1.start();
  24.                 thread2.start();
  25.         }
  26. }
复制代码
回复 使用道具 举报
freehello 发表于 2015-9-1 13:03
不好意思,我是按我的输出分析的,抱歉。
为什么是线程2是100,因为System.out.println是一个函数,它挂起 ...

那为什么只有100票打印二次   剩下的99张如果  有一个线程挂起,保存栈中,返回时接着执行应该有很多打印2次的情况为什么我测试几百次都是只打印2次100  其他都正常的
回复 使用道具 举报
backin 发表于 2015-9-1 19:56
其实这个就是因为运算符优先级的问题。+count--的时候因为打印的优先级比运算的优先级要高,所以是先打印, ...

括起来问题照样出线
回复 使用道具 举报
boboyuwu 发表于 2015-9-1 21:53
括起来问题照样出线

你什么电脑{:2_44:}
回复 使用道具 举报
ls也能最佳答案。。。醉了。明明是没加锁。
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 加入黑马