单例模式核心结构中只包含一个被称为单例类的核心类,单例模式可以保证系统中一个类只有一个实例且易于外界访问,对于需要重复使用的实例可以节约资源。
单例模式的要点有三个:
一是某个类只能有一个实例;
二是它必须自行创建这个实例;
三是它必须自行向整个系统提供这个实例。
懒汉式
public class SingletonClass{
private SingletonClass(){
}
private static SingletonClass instance=null;
public static synchronized SingletonClass getInstance()
{
if(instance==null)
{
instance=new SingletonClass();
}
return instance;
}
}
饿汉式
public static class Singleton{
private Singleton(){
}
//在自己内部定义自己的一个实例,只供内部调用
private static final Singleton instance = new Singleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance(){
return instance;
}
}
饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变,懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的
双重锁
public static class Singleton{
private Singleton(){
}
private static Singleton instance=null;
public static Singleton getInstance(){
if(instance==null){
//双重检查加锁,只有在第一次实例化时,才启用同步机制,提高了性能
synchronized(Singleton.class){
if(null==instance){
instance=new Singleton();
}
}
}
return instance;
}
}