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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗正荣 中级黑马   /  2013-2-27 22:45  /  1671 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 罗正荣 于 2013-2-28 21:22 编辑
  1. class Ticket implements Runnable
  2. {
  3. private static int tick = 100;
  4. boolean flag = true;
  5. public void run()
  6. {
  7. if(flag)
  8. {
  9. while(true)
  10. {
  11. synchronized(Ticket.class)
  12. {
  13. if(tick>0)
  14. {
  15. try{Thread.sleep(10);}catch(Exception e){}
  16. System.out.println(Thread.currentThread().getName()+"....code : "+ tick--);
  17. }
  18. }
  19. }
  20. }
  21. else
  22. while(true)
  23. show();//这里应该是省略了Ticket.这样才能起到同步的作用,但是我感觉这个
  24. //show难道不是对象在调用吗?为什么是Ticket类在调用呢?
  25. }
  26. public static synchronized void show()
  27. {
  28. if(tick>0)
  29. {
  30. try{Thread.sleep(10);}catch(Exception e){}
  31. System.out.println(Thread.currentThread().getName()+"....show.... : "+ tick--);
  32. }
  33. }
  34. }


  35. public class StaticMethodDemo
  36. {
  37. public static void main(String[] args)
  38. {

  39. Ticket t = new Ticket();
  40. Thread t1 = new Thread(t);
  41. Thread t2 = new Thread(t);
  42. t1.start();
  43. try{Thread.sleep(10);}catch(Exception e){}
  44. t.flag = false;
  45. t2.start();


  46. }
  47. }
复制代码
问题就是代码中的注释?求解

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 神马都是浮云

查看全部评分

4 个回复

倒序浏览
本帖最后由 莫嘉伟 于 2013-2-27 23:02 编辑

show有static修饰啊,是类方法啊可以用Ticket类直接调用,,顺便说一下,用对象调用其实也是可以的,不过用类也可以,还有的话因为这个是类方法,是属于类的,所有对象共享的,你用该类的任何对象去调用它会出来一样的结果,因为这些类的实例实际上还是通过类本身去调用它。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
因为你11行锁的对象为类名.class ,show()方法为静态方法,该方法也是类名.class锁  这样是同步的
而用对象调用show()方法,为一个对象锁,
一个用对象锁,一个为类名.class 锁   锁不同,起不到同步的作用
回复 使用道具 举报
莫嘉伟 发表于 2013-2-27 22:58
show有static修饰啊,是类方法啊可以用Ticket类直接调用,,顺便说一下,用对象调用其实也是可以的,不过用 ...

谢谢:handshake
回复 使用道具 举报
public static synchronized void show()这里show()是Ticketl类的同步静态函数,处于类的成员位置,可以用类名直接调用。

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