单例模式:解决一个类在内存中只存在一个对象
想要保证对象唯一
1.为了避免其他程序过多建立该类对象,先禁止其他程序建立该对象
2.为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象。
3.为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式。
1.将构造函数私有化
2.在类中创建一个本类对象
3.提供一个方法获取该对象
class Single//饿汉式,single类一进内存,就已经创建好了对象
{
private int num;
private Single(){}//1
private static Sinle s=new Single();//2
public static Single getInstance()//3
{
return s;
}
public void setNum(int num)
{
this.num=num;
}
public int getNum()
{
return num;
}
}
class Single//懒汉式,对象被方法调用时,才初始化,也叫做对象的延时加载。类加载时,只有调用Instance时,才建立对象
{
private static Single s=null;
private Single(){}
public static Single getInstance()
{
if(s==null)
s=new Single();
return s;
}
}
class SingleDemo
{
public static void main(String [] args)
{
Single ss=Single.getInstance();
}
}
饿汉式较懒汉式安全。建议使用饿汉式。
懒汉式if(s==null)时,可能发生安全问题。(多线程)
if(s==null)
-->A A进入,然后挂起,不执行,执行B
-->B B进入,然后挂起,不执行,执行A
s=new single();AB可能产生两个对象。
改进方案:
1. public static synchronized Single getInstance()
加锁,但影响效率。
2.双重判断
if(s==null)
{
synchronized(Single.class)
{
if(s==null)
s=new Single();
}
}
return s;