单例模式的定义:保证一个类仅有一个实例,并提供一个访问他的全局访问点。

单例模式结构图:


单例模式Singleton_线程安全


Singleton:负责创建Singleton类自己的唯一实例,并提供一个getInstance的方法,让外部来访问这个类的唯一实例。

单例模式示例代码:

懒汉式:(第一次用的时候实例化)

public class Singleton
{
private statoc Singleton instance=null;
private Singleton()//私有的构造函数
{
}
public static synchronized Singleton getInstance()//线程安全
{
if(instance==null)
{
instance=new Singleton();
}
return instance;
}
public void singletonOperation(){}//可以有自己的操作等
}


懒汉式的调用顺序:



单例模式Singleton_饿汉式_02


饿汉式:(一开始就进行实例化)

public class Singleton
{
private static Singleton instance=new Singleton();
private Singleton(){}
public static Singleton getInstance()
{
return instance;
}
public void singletonOperation(){}//可以有自己的操作等
}

饿汉式的调用顺序:


单例模式Singleton_单例模式_03



单例模式的功能:

单例模式是用来保证这个类在运行期间只会被创建一个类实例,另外,单例模式还提供了一个全局唯一访问这个类实例的访问点,就是getInstance,对于单例模式而言,不管采用何种方式实现,都是只关心它的创建问题,并不关心具体的业务功能。

单例模式的范围:Java里面实现的单例是一个虚拟机的范围,装载类的功能是虚拟机的,虚拟机在通过自己的ClassLoader装载饿汉式实现单例类的时候就会创建一个类的实例。

饿汉式是线程安全的,因为虚拟机保证只会装载一次,在装载类的时候是不会发生并发的。

使用内部类实现延迟加载和线程安全:

示例:

public class Singleton
{
//类级的内部类,也是静态的成员式内部类,该内部类的实例和外部类的实例没有绑定关系们只要被调用时才会装载,从而实现了延迟加载
private static class SingletonHolder
{
//静态初始化器,由JVM来保证线程安全
private static Singleton instance=new Singleton();
}
private Singleton(){}
public static Singleton getInstance()
{
return SingletonHolder.instance;
}
}


当getInstance方法第一次调用的时候,它第一次读取SingletonHolder.instance,导致SingletonHolder类得到初始化,而这个类在装载并初始化的时候,会初始化它的静态域,从而创建Singleton的实例,由于是静态的域,因此只会在虚拟机装载类的时候初始化一次,并由虚拟机类保证他的线程安全性。

单例模式的本质:控制实例数目