特点
某个类只能有一个实例,提供一个全局的访问点
实现
1. 采用静态属性,饿汉模式
缺点:在类装载的时候就完成实例化,没有达到Lazy Loading的效果。如果从始至终从未使用过这个实例,则会造成内存的浪费。
public class SingleInstance {
private SingleInstance(){}
public static SingleInstance instance = new SingleInstance();
}
几种变形:
- 使用静态常量
public class SingleInstance {
private SingleInstance(){}
private final static SingleInstance instance = new SingleInstance();
public static SingleInstance getInstance(){
return instance;
}
}
- 使用静态代码块
public class SingleInstance {
private SingleInstance(){}
private static SingleInstance instance;
static {
instance = new SingleInstance();
}
public static SingleInstance getInstance(){
return instance;
}
}
2.使用内部锁,懒汉模式
缺点:率太低了,每个线程在想获得类的实例时候,都需要执行同步方法
public class SingleInstance {
private SingleInstance(){}
private static SingleInstance instance;
public synchronized static SingleInstance getInstance(){
return new SingleInstance();
}
}
3.使用双重检查,懒汉模式
public class SingleInstance {
private SingleInstance(){}
private static SingleInstance instance;
public static SingleInstance getInstance(){
if(instance==null){
synchronized (SingleInstance.class){
if(instance==null){
instance = new SingleInstance();
}
}
}
return instance;
}
}
4.静态内部类
public class SingleInstance {
private SingleInstance(){}
public static SingleInstance getInstance(){
return InnerClass.instance;
}
static class InnerClass{
private static SingleInstance instance = new SingleInstance();
}
}
5.使用枚举
public enum SingleInstance {
INSTANCE
;
public static void metod(){}
}
网友评论