如果同步函数被静态修饰之后,使用的锁是什么呢?
通过验证,发现不在是this。因为静态方法中也不可以定义this。
静态进内存是,内存中本来没有对象,但是一定有该类对应的字节码对象。(类名.class)该对象的类型是class
得出结论:
静态的同步方法,使用的锁是该方法所在类的字节码文件对象。
package day6;
/**
* 静态同步函数
*
* 这里同步函数被静态修饰之后,有一定几率会出现线程不安全的错误
* 说明这时静态同步函数的锁已经不是当前对象了,那么我们应该怎么办?
* (静态函数中不能定义this)
*
* 静态进内存是,内存中本来没有对象,但是一定有该类对应的字节码对象。
* (类名.class)该对象的类型是class
得出结论:
静态的同步方法,使用的锁是该方法所在类的字节码文件对象。
* @author mzy
*
*/
publicclassTest2{
publicstaticvoidmain(String[]args){
Ticket1tk=newTicket1();
Threadt1=newThread(tk);
Threadt2=newThread(tk);
t1.start();
try{
Thread.sleep(10);// 让主线程sleep 10ms
// 这里必须抛出异常
}catch(Exceptione){
}
t2.start();
}
}
classTicket1implements Runnable{
privatestaticintticket=100;
booleanflag=true;
publicvoidrun(){
if(flag){
while(true){
synchronized(Ticket1.class){// 将当期对象作为synchronized 的锁
if(ticket>0){
System.out.println("同步代码块"+Thread.currentThread().getName()+"卖出第"+ticket+"张票");
ticket--;
}
}
}
}else{
while(true){
show();
}
}
}
privatestaticsynchronizedvoidshow(){
if(ticket>0){
System.out.println("同步函数"+Thread.currentThread().getName()+"卖出第"+ticket+"张票");
ticket--;
}
}
}