什么是单例模式?
单例模式是常用的设计模式,在我们的系统乃至在框架中都普遍被用到,单例模式就是使一个类有且只有一个实例用于外部访问,这样大大的节省了系统的资源,而单例模式需要注意的也就以下三点:
- 保证这个类有且只有一个实例
- 自行创建这个实例
- 提供这个实例供外部访问
代码实现需要注意的就是
- 单例模式的类构造方法私有化
- 这个类的定义中包含自己的一个静态实例对象
- 提供一个共有静态方法供外部调用
三种实现方式
1、懒汉式
懒汉式与延迟初始化有些相似,就是没人用的时候我不实例化出来,有人需要调用了我再实例化出来,JAVA代码实现如下
public class SingletonClz{
//实例
private static SingletonClz instance = null;
//私有构造
private SingletonClz(){}
//外部调用方法
public static getInstance()
{
if(null == instance)
{
instance = new SingletonClz();
return instance;
}
else
{
return instance;
}
}
}
2、饿汉式
先实例化出来,有人用就直接返回即可
public class SingletonClz{
//实例
private final static SingletonClz INSTANCE = new SingletonClz();
//私有构造
private SingletonClz(){}
//外部调用方法
public static getInstance()
{
return instance;
}
}
3、加锁的单例模式
public class SingletonClz{
//实例
private static SingletonClz instance = null;
//私有构造
private SingletonClz(){}
//外部调用方法
public static getInstance()
{
synchronized(SingletonClz.class)
{
if(null == instance)
{
instance = new SingletonClz();
}
}
return instance;
}
}
这里加一个重量级的锁是为了防止并发的情况下两个线程同时访问这个方法同时发现instace为null,就都跑去实例化这个对象了。加了一个synchronized锁就防止了这一情况的发生,当有一个线程拿到了锁,另一个就阻塞在外面知道锁的释放,当线程A实例化完成并释放锁后,B进来发现instace不等于空了,就不会再去实例化了。