单例设计模式有两种表现形式:
①“饿汉式”
②“懒汉式”
我们先来看看传说中的饿汉式:
public class Single
{
private Single(){}//构造方法私有化
private static Single instance = new Single();//实例化对象
public static Single getInstance()
{
return instance;//暴露方法返回instance的对象
}
}
饿汉式的特点:创建对象的同时就直接实例化对象。
那我们在看看“懒汉式”:
public class Single
{
private Single(){}//构造方法私有化
private static Single instance = null;
public static Single getInstance()
{
if (instance==null)//这里判断看instance是否为空
{
instance = new Single();//对象为空,实例化对象
}
return instance;//返回对象
}
}
懒汉式的特点:方法被加载时才进行初始化操作,“懒汉式”又被称为延迟加载设计模式。
仔细观察,懒汉式的代码是有弊端的,我们来看看。
当多线程访问懒汉式时,因为懒汉式的方法内对共性数据进行多条语句的操作。所以容易出现线程安全问题。
class Single
{
private static Single s = null;
private Single(){}
public static Single getInstance()
{ // 锁是谁?字节码文件对象;
if (s == null)//该处判断是减少判断,增加效率
{
synchronized (Single.class)//保证线程安全
{
if (s == null)//判断对象是否为空
s = new Single();//实例化对象
}
}
return s;//返回变量
}
}
上面加了几处判断,我们来分析下:
① s==null 是为了减少判断,增加效率
②synchronized (Single.class)为了保证线程安全
③if (s == null)是为了判断对象是否为空
为了解决,加入同步机制,解决安全问题。但是却带来了效率降低。所以我们不建议使用“懒汉式”,饿汉式简单高效,安全。