黑马程序员技术交流社区

标题: 线程问题 [打印本页]

作者: 李道福    时间: 2013-4-4 10:49
标题: 线程问题
本帖最后由 李道福 于 2013-4-4 21:13 编辑
  1. class Ticket4 implements Runnable
  2. {
  3.         private  int tick = 100;
  4.         private boolean flag=true;
  5.         Object obj = new Object();  
  6.         public void run()
  7.         {
  8.          while(true)
  9.                 {        
  10.                 if(flag)
  11.                         synchronized(obj)
  12.                         {
  13.                                 if(tick>0)
  14.                                 {
  15.             System.out.println("-obj-"+Thread.currentThread().getName()+"---");
  16.                                              System.out.println("Ticket:"+tick--);
  17.                                              flag=false;
  18.                                 }
  19.                         }else
  20.                                 show();
  21.                 }
  22.         }
  23.         public synchronized void show(){
  24.                 if(tick>0){
  25.                         System.out.println("-show-"+Thread.currentThread().getName()+"---");
  26.                         System.out.println("Ticket:"+tick--);
  27.                         flag=true;
  28.                 }
  29.         }
  30. }


  31. class  TestTicket4
  32. {
  33.         public static void main(String[] args)
  34.         {
  35.                
  36.                 Ticket4 t = new Ticket4();
  37.                
  38.                 Thread t1 = new Thread(t);
  39.                 Thread t2 = new Thread(t);
  40.                 Thread t3 = new Thread(t);
  41.                 Thread t4 = new Thread(t);
  42.                 t1.start();
  43.                 t2.start();
  44.                 t3.start();
  45.                 t4.start();


  46.         }
  47. }

  48. 这个代码有什么问题嘛?所有的线程都是在执行时都是同一把锁,为什么在输出时还会输出0;并且输出的结果也不是按我想的那样同步代码块和同步方法
  49. 互换依次输出?
复制代码

作者: 随便    时间: 2013-4-4 11:04
run(){
synchronized (this) {}//改成这样就行了。
}


首先你的问题是你没有完全明白synchronized的原理。
必须是同一个锁对象的时候才能得到你预想的结果。

你的
public synchronized void show();使用的锁对象其实是该对象,this.
而 synchronized(obj){}使用的锁对象是Object的一个对象。所以你这样等于没有起到你想要的作用。

另外给你总结几个,
synchronized(this){}等同于public synchronized void method();
synchronized(类名.class) 等同于public static synchronized void method();
                        





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