黑马程序员技术交流社区

标题: Q1:诡异!用同步代码块处理后多线程仍然出现安全问题 [打印本页]

作者: dicegame    时间: 2013-7-27 22:06
标题: Q1:诡异!用同步代码块处理后多线程仍然出现安全问题
本帖最后由 杜光 于 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等错票,为什么呢?
作者: 王磊    时间: 2013-7-27 22:14
同步锁的对象定义错误,应该讲Object obj = new Object();定义在类的成员位置。或者直接使用this作为锁。
楼主这样将所定义在了run方法内,相当于4个线程分别创建了4个锁,并且互不干涉。

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

汗,原来是这样,谢谢!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2