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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 杜光 于 2013-7-28 09:28 编辑
  1. package qbb;

  2. class Ticket implements Runnable{
  3.         private int ticketNo = 100;
  4.         public void run(){
  5.                 while(true){
  6.                         Object obj = new Object();
  7.                         synchronized(obj){
  8.                                 if(ticketNo > 0){
  9.                                         try {
  10.                                                 Thread.sleep(10);
  11.                                         } catch (InterruptedException e) {
  12.                                                 e.printStackTrace();
  13.                                         }
  14.                                         System.out.println(Thread.currentThread().getName() + "\t"
  15.                                                         + ticketNo-- + " has been saled");
  16.                                 }
  17.                         }
  18.                 }
  19.         }
  20. }
  21. public class Test{
  22.         public static void main(String[] args){
  23.                 Ticket t = new Ticket();
  24.                 Thread t1 = new Thread(t);
  25.                 Thread t2 = new Thread(t);
  26.                 Thread t3 = new Thread(t);
  27.                 Thread t4 = new Thread(t);
  28.                 t1.start();
  29.                 t2.start();
  30.                 t3.start();
  31.                 t4.start();
  32.         }
  33. }
复制代码
用eclipse运行后,结果中仍然出现0,-1,-2等错票,为什么呢?

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

3 个回复

倒序浏览
同步锁的对象定义错误,应该讲Object obj = new Object();定义在类的成员位置。或者直接使用this作为锁。
楼主这样将所定义在了run方法内,相当于4个线程分别创建了4个锁,并且互不干涉。

多线程同步的要求是操作共有数据的线程,要操作同一个锁。

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
.....同步块的作用是因为操作用一个数据,或者同一个数据库,只允许一个线程进入,但你new了四个线程后没有直接带参,相当于建了四个数据。不是一个数据。
回复 使用道具 举报
王磊 发表于 2013-7-27 22:14
同步锁的对象定义错误,应该讲Object obj = new Object();定义在类的成员位置。或者直接使用this作为锁。
...

汗,原来是这样,谢谢!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马