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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 胡建伟 于 2014-3-29 19:17 编辑
  1. class Ticket implements Runnable {
  2. private static int ticket = 200;//将ticket也改为静态,在方法区中存在
  3. //Object obj = new Object();
  4. public void run() {
  5. while(true) {
  6. //this.show();//默认前面有this,系统会自己加上
  7. Ticket.show();
  8. }
  9. }
  10. //注意:同步函数不能把while(true){}也包含在内,否则,死循环,只有一个进程在里面,一直ture执行下去
  11. public static synchronized void show() {
  12. if(ticket>0) {
  13. try {
  14. Thread.sleep(10);
  15. } catch (Exception e) {}
  16. System.out.println(Thread.currentThread().getName()+"...sale:"+ticket--);
  17. }
  18. }
  19. }

  20. public class SalesTicket {
  21. public static void main(String[] args) {
  22. Ticket t = new Ticket();
  23. Thread t1 = new Thread(t);//创建一个线程,将t做为参数传递给Thread
  24. Thread t2 = new Thread(t);
  25. Thread t3 = new Thread(t);
  26. t1.start();
  27. t2.start();
  28. t3.start();

  29. }

  30. }
复制代码

毕向东-Java基础视频-多线程-静态同步函数的锁是class对象,视频里将同步函数被静态修饰后,他的锁就不在是this了,而是类名.class,那为什么所将例子中只是在同步代码块对象用到了锁,show()方法却依然是默认的this啊???

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 神马都是浮云

查看全部评分

2 个回复

正序浏览
while(true)它是一个死循环。它会一直不停的做一件事情。这里的意思是把要保护的内码使用synchronized给保护起来。让它们互斥。即同时只能有一个线程执行这段代码。如果两个线程同时都执行了,就出现了线程安全的问题。静态方法上的synchronized默认使用的是this做为监视器对象,它要和代码块中的互斥使用同一个监视器对象。因为静态方法它是有一个对象和它进行关联的,因为它不创建对象,而在加载类的字节码文件时候,其实内存里面已经存在了这个类的字节码文件对象,所以我们可以使用静态方法所在的类的字节码文件对象做为这个静态方法和局部代码块所使用的共同的监视器对象。希望能帮得上你。

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

回复 使用道具 举报
首先我没搞懂。。楼主哪里看出来这里的show方法用的是默认的锁  this?
因为这里的show是静态的,他的锁就是它所存在的类所对应的字节码文件.你的show方法应该是定义在类Ticket里面的吧。因此show的锁时 Ticket.class。
而你看到的同步代码块 和show方法其实实现的是同一个功能,同步代码快和show的锁应该是一个啊。所以给同步代码块加上一个和show一模一样的锁。
也就是锁 这里的同步代码块的锁时根据同步函数来确定的。

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

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