Java中的单利模式
1.实现java的单利模式要具备以下三个要素
单例模式有以下特点:
- 单例类只能有一个实例。
- 单例类必须自己创建自己的唯一实例。
- 单例类必须给所有其他对象提供这一实例
要实现一个单例模式要实现以下三点
- 要有一个静态的私有的成员变量,但是不做初始化。
- 要有一个私有的构造方法,主要是不让其他的类New这个方法。
- 要有一个公共的静态的入口方法。
具体看下面的例子:
public class Singleton {
private static Singleton singleton=null; //1.私有的成员变量
private Singleton(){}; //2.私有的构造方法,避免在外部被实例化
private static Singleton getInstance(){ //3.公共的静态入口方法
if(singleton==null){
singleton=new Singleton();
}
reutrn singleton;
}
}
为了考虑线程安全,可以再getInstance()上面加synchronized
private static synchronized Singleton getInstance(){
if(singleton==null){
singleton=new Singleton();
}
reutrn singleton;
}
}
2.单例模式分为懒汉式和饿汉式
- 懒汉式:在第一次调用的时候才实例化自己。
饿汉式:不管其他类是否调用,类初始化的时候就实例化自己。
在上面的例子当中,那属于懒汉式,懒汉式和饿汉式的代码的区别在于 public class Singleton1 { private Singleton1() {} private static final Singleton1 single = new Singleton1(); //一开始就线程安全 public static Singleton1 getInstance() { return single; } }
3.单例模式的使用场景
类在设计的时候要没有可以修改的成员变量,不然存在可修改的成员变量则会产生线程安全的问题,不建议使用单例模式是无法继承的,所以无法扩展,所以读取配置文件的时候比较合适用单例。
补充:
为了使懒汉式的线程安全,除了加synchronized,还可以有以下2个方法
//双重检查锁定
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
//静态内部类,这中最好,线程安全,而且不会影响性能。
public class Singleton {
private static class LazyHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return LazyHolder.INSTANCE;
}
}