单件模式
public class Singleton {
private static Singleton uniqueInstance;
private Singleton() {}
public static synchronized Singleton getInstance()
{
if(uniqueInstance==null)
{
uniqueInstance=new Singleton();
}
return uniqueInstance;
}
}
通过增加synchronized关键字到getInstance()方法中,我们迫使每个线程在进入这个方法之前,要先等到别的线程离开该方法。也就是说,不会有两个线程可以同时进入这个方法。
1、如果getInstance()的性能对应用程序不是很关键,就什么都别做
同步getInstance()的方法既简单又有效,但是,同步一个方法可能造成程序执行效率下降100倍。因此,如果将getInstance()的程序用在频繁运用的地方,你可能就得重新考虑了。
2、使用“急切”创建实例,而不用延迟实例化的做法
public class Singleton {
private static Singleton uniqueInstance=new Singleton();
private Singleton() {}
public static Singleton getInstance()
{
return uniqueInstance;
}
}
利用这个做法,我们依赖JVM在加载这个类时马上创建此唯一的单件实例。JVM保证在任何线程访问uniqueInstance静态变量之前,一定先创建此实例。
3、用“双重检查加锁”,在getInstance()中减少使用同步
public class Singleton {
private volatile static Singleton uniqueInstance;
private Singleton() {}
public static Singleton getInstance()
{
if(uniqueInstance==null)
{
synchronized(Singleton.class) {
if(uniqueInstance==null) {
uniqueInstance=new Singleton();
}
}
}
return uniqueInstance;
}
}