黑马程序员技术交流社区

标题: 多线程,静态同步锁的问题 [打印本页]

作者: 罗正荣    时间: 2013-2-27 22:45
标题: 多线程,静态同步锁的问题
本帖最后由 罗正荣 于 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. }
复制代码
问题就是代码中的注释?求解
作者: 莫嘉伟    时间: 2013-2-27 22:58
本帖最后由 莫嘉伟 于 2013-2-27 23:02 编辑

show有static修饰啊,是类方法啊可以用Ticket类直接调用,,顺便说一下,用对象调用其实也是可以的,不过用类也可以,还有的话因为这个是类方法,是属于类的,所有对象共享的,你用该类的任何对象去调用它会出来一样的结果,因为这些类的实例实际上还是通过类本身去调用它。
作者: 余善航    时间: 2013-2-28 18:47
因为你11行锁的对象为类名.class ,show()方法为静态方法,该方法也是类名.class锁  这样是同步的
而用对象调用show()方法,为一个对象锁,
一个用对象锁,一个为类名.class 锁   锁不同,起不到同步的作用

作者: 罗正荣    时间: 2013-2-28 21:21
莫嘉伟 发表于 2013-2-27 22:58
show有static修饰啊,是类方法啊可以用Ticket类直接调用,,顺便说一下,用对象调用其实也是可以的,不过用 ...

谢谢:handshake
作者: HM王琦    时间: 2013-2-28 23:06
public static synchronized void show()这里show()是Ticketl类的同步静态函数,处于类的成员位置,可以用类名直接调用。






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