对于静态同步方法,加在上面的锁就是其存在的类本身
package thread;
/*
如果同步函数被静态修饰后,使用的锁是什么呢?
通过验证,发现不在是this。因为静态方法中也不可以定义this。
静态进内存是,内存中没有本类对象,但是一定有该类对应的字节码文件对象。
类名.class 该对象的类型是Class
静态的同步方法,使用的锁是该方法所在类的字节码文件对象。 类名.class
对于单例模式,如果是使用懒汉模式(延迟加载)(饿汉模式是类加载的时候直接初始化对象),则其getInstance方法需要加锁:
public static Single getInstance(){
if(s==null){ //建立实例之后就不用再检查锁,提高效率
synchronized(Single.class){ //同步锁使用该类
if(s==null)
s = new Single();
}
}
return s;
}
*/
public class Thread_4_SynMethodDemo3 {
public static void main(String[] args){
Ticket4 t = new Ticket4();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
t1.start();
try{Thread.sleep(10);}catch(Exception e){}
t.flag = false;
t2.start();
}
}
class Ticket4 implements Runnable{
private static int tick = 100;
Object obj = new Object();
boolean flag = true;
public void run(){
if(flag){
while(true) {
synchronized(Ticket4.class) { //这样就喝静态同步方法一样了,用了同样的锁
//synchronized(obj){ //这样会导致危险
if(tick>0){
try{Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"....code : "+ tick--);
}
}
}
}
else
while(true)
show();
}
public static synchronized void show(){
if(tick>0){
try{Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"....show.... : "+ tick--);
}
}
}