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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李道福 中级黑马   /  2013-4-4 10:49  /  1039 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李道福 于 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. 互换依次输出?
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

1 个回复

倒序浏览
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();
                        

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马