您的位置:首页 > 编程语言 > Java开发

Java多线程 6 静态同步方法的锁

2013-09-18 23:58 316 查看
对于静态同步方法,加在上面的锁就是其存在的类本身

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--);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐