黑马程序员技术交流社区
标题:
多线静态同步函数的锁是类名.class视频里why在同步代码块...
[打印本页]
作者:
胡建伟
时间:
2014-3-29 16:29
标题:
多线静态同步函数的锁是类名.class视频里why在同步代码块...
本帖最后由 胡建伟 于 2014-3-29 19:17 编辑
class Ticket implements Runnable {
private static int ticket = 200;//将ticket也改为静态,在方法区中存在
//Object obj = new Object();
public void run() {
while(true) {
//this.show();//默认前面有this,系统会自己加上
Ticket.show();
}
}
//注意:同步函数不能把while(true){}也包含在内,否则,死循环,只有一个进程在里面,一直ture执行下去
public static synchronized void show() {
if(ticket>0) {
try {
Thread.sleep(10);
} catch (Exception e) {}
System.out.println(Thread.currentThread().getName()+"...sale:"+ticket--);
}
}
}
public class SalesTicket {
public static void main(String[] args) {
Ticket t = new Ticket();
Thread t1 = new Thread(t);//创建一个线程,将t做为参数传递给Thread
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
t1.start();
t2.start();
t3.start();
}
}
复制代码
毕向东-Java基础视频-多线程-静态同步函数的锁是class对象,视频里将同步函数被静态修饰后,他的锁就不在是this了,而是类名.class,那为什么所将例子中只是在同步代码块对象用到了锁,show()方法却依然是默认的this啊???
QQ截图20140329162731.jpg
(128.12 KB, 下载次数: 26)
下载附件
2014-3-29 16:27 上传
作者:
海世山盟
时间:
2014-3-29 17:45
首先我没搞懂。。楼主哪里看出来这里的show方法用的是默认的锁 this?
因为这里的show是静态的,他的锁就是它所存在的类所对应的字节码文件.你的show方法应该是定义在类Ticket里面的吧。因此show的锁时 Ticket.class。
而你看到的同步代码块 和show方法其实实现的是同一个功能,同步代码快和show的锁应该是一个啊。所以给同步代码块加上一个和show一模一样的锁。
也就是锁 这里的同步代码块的锁时根据同步函数来确定的。
作者:
syusikoku
时间:
2014-3-29 22:02
while(true)它是一个死循环。它会一直不停的做一件事情。这里的意思是把要保护的内码使用synchronized给保护起来。让它们互斥。即同时只能有一个线程执行这段代码。如果两个线程同时都执行了,就出现了线程安全的问题。静态方法上的synchronized默认使用的是this做为监视器对象,它要和代码块中的互斥使用同一个监视器对象。因为静态方法它是有一个对象和它进行关联的,因为它不创建对象,而在加载类的字节码文件时候,其实内存里面已经存在了这个类的字节码文件对象,所以我们可以使用静态方法所在的类的字节码文件对象做为这个静态方法和局部代码块所使用的共同的监视器对象。希望能帮得上你。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2