单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例,即一个类只有一个对象实例。
Java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。”
package 单例模式;
import java.util.HashMap;
import java.util.Map;
//1.懒汉式单例类,调用getInstance()则实例化,不调用不实例化
public class Singleton {
/**
* Singleton通过将构造方法限定为private避免了类在外部被实例化,
* 在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。
*/
private Singleton(){}
private static Singleton single=null;
//确保线程安全的写法
//(1)在getInstance方法上加同步
public static synchronized Singleton getInstance(){
if(single==null){
single=new Singleton();
}
return single;
}
//(2)双重检查锁定
public static Singleton getInstance2(){
if(single==null){
synchronized(Singleton.class){
if(single==null){
single=new Singleton();
}
}
}
return single;
}
}
//(3)静态内部类[既实现了线程安全,又避免了同步带来的性能影响]
class SingletonStatic{
private static class LazyHolder{
private static final SingletonStatic INSTANCE=new SingletonStatic();
}
private SingletonStatic(){}
public static final SingletonStatic getInstance(){
return LazyHolder.INSTANCE;
}
}
/**
* 2.饿汉式单例类,在类初始化时,已经自行实例化
* 饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,
* 以后不再改变,所以天生是线程安全的。
*/
class Singleton2{
private Singleton2(){}
private static final Singleton2 single=new Singleton2();
//静态工厂方法
public static Singleton2 getInstance(){
return single;
}
}
----------------------------------------------
package 单例模式;
/*
* 测试类
*/
public class Test {
public static void main(String[] args) {
// Singleton3 single3=Singleton3.getInstance(null);
// System.out.println(single3.about());
Singleton s1=Singleton.getInstance();
Singleton s2=Singleton.getInstance();
System.out.println(s1);
System.out.println(s2);
}
}
执行测试类,控制台打印如下:
单例模式.Singleton@1db9742
单例模式.Singleton@1db9742