第一种:
定义私有构造函数:
private Single1(){}
定义私有对象:
private static Single1 instance=new
Single1();
定义公共静态方法:
public static Single1 create(){
return instance;
}
外界只需调用静态方法,即可获得该对象:
Single1 test =
Single1.create();
第一种特点:调用块,不调用也有空间保存对象
-------------------------------------------
第二种:(推荐)
同上,定义私有构造函数:
private Single2(){}
定义私有对象,不要 new 出对象!
private static Single2 instance;
写公共静态方法:
public synchronized static Single2
create(){
init();
if(instance == null){
synchronized(Single2.class){
//这里还需上锁,因为第一个人进来后,开始等待new对象
if(instance
== null) //这时如果第二人也进来了,不能让第二人也new对象
instance = new Single2();
}
return instance;
}
return
instance;
}
public static void init(){} //用来做初始化
解释:synchronized关键字,代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C
D等),有的话要等正在使用这个方法的线程B(或者C D)运行完这个方法后再运行此线程A,没有的话,直接运行它包括两种用法:synchronized 方法和
synchronized 块。
防止多人访问卡死
第二种特点:不在内存中保存对象,第一次创建对象慢