设计模式17:单例模式
单例模式就是说系统中对于某类的只能有一个对象,不可能出来第二个。
static修饰的方法,不能再用abstract修饰,也不能Override。这是因为static方法是属于类的,不会被继承。
最基本的单例模式不是线程安全的,当有多个线程同时getInstance时,有可能实例化了多个对象。
下面比较单例模式的几种实现方式的优缺点:
Hungry模式:
public class HungrySingleton{
static HungrySingleton instance = new HungrySingleton();
private HungrySingleton(){
}
public static HungrySingleton getInstance(){
return instance;
}
}
这种模式当类被加载时,创建一个实例。当系统中这样的类较多时,会使得启动速度变慢 。现在流行的设计都是讲“延迟加载”,我们可以在第一次使用的时候才初始化第一个该类对象。所以这种适合在小系统。
Lazy模式1:
public class LazySingleton1 {
static LazySingleton1 instance;
private LazySingleton1(){
}
public synchronized static LazySingleton1 getInstance(){
if(instance == null){
instance = new LazySingleton1();
}
return instance;
}
}
上述代码中的一次锁住了一个方法, 这个粒度有点大 ,改进就是只锁住其中的new语句就OK。就是所谓的“双重锁”机制。
Lazy模式2:
public class LazySingleton2 {
static LazySingleton2 instance;
private LazySingleton2(){
}
public static LazySingleton2 getInstance(){
if(instance == null){
synchronized (LazySingleton2.class) {
if(instance == null){
instance = new LazySingleton2();
}
}
}
return instance;
}
}
浙公网安备 33010602011771号