Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍两种:懒汉式单例、饿汉式单例。
单例模式有以下特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
一、懒汉式单例
//懒汉式单例类.在第一次调用的时候实例化自己
public class Singleton {
private Singleton() {}
private static Singleton single=null;
//静态工厂方法
public static Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
}
Singleton通过将构造方法限定为private避免了类在外部被实例化,
在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。
二、饿汉式单例
public class Singleton1 {
private static Singleton1 instance = null;
static {
instance = new Singleton1();
}
private Singleton1(){
}
public static Singleton1 getInstance(){
return instance;
}
}
饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。
//饿汉式单例类不能实现延迟加载,不管将来用不用始终占据内存;
//懒汉式单例类线程安全控制烦琐,而且性能受影响。
//Initialization Demand Holder (IoDH)
//在IoDH中,我们在单例类中增加一个静态(static)内部类,既实现了线程安全,又避免了同步带来的性能影响。
//在该内部类中创建单例对象,再将该单例对象通过getInstance()方法返回给外部使用
public class SingletonIniti {
private SingletonIniti() {
}
private static class SingletonHolder {
private static final SingletonIniti INSTANCE = new SingletonIniti();
}
public static SingletonIniti getInstance() {
return SingletonHolder.INSTANCE;
}
public static void main(String args[]) {
SingletonIniti s1, s2;
s1 = SingletonIniti.getInstance();
s2 = SingletonIniti.getInstance();
System.out.println(s1==s2);
}
}
打印的结果