单例模式:一个类在内存中只有一个对象
思想:1、保证对象唯一,避免建立多个对象,禁止其他程序创建该类对象
2、为了可以让其他程序访问到该类,在本类自定义一个对象
3、给其他程序提供访问方式
实现:1、将构造函数私有化
2、在类中创建一个本类对象
3、提供一个方法可以获取该对象
有特有参数这个单例模式才有意义
//实际开发推荐 饿汉式
/**
* 饿汉式,single类一进内存就已创建好对象
* 记忆点:管他饿不饿,先创建再说
*/
class Single{
//特有参数
private string para;
get/set();
//私有化构造方法
private Single(){}
//私有的创建对象方法
private static Single single = new Single();
//给外部提供调用方法
public static Single getInstance(){
return single;
}
}
/**
* 懒汉式,single类进内存还没有创建对象,只有调用了getInstance()方法才创建对象
* 记忆点:创建对象时先问一下 饿不? true 创建 false 直接返回
*/
class Single{
//特有参数
private string para;
get/set();
//私有化构造方法
private Single(){}
//私有的创建对象方法
private static Single single = null;
//给外部提供调用方法
/**
* TODO此处存在问题:如果两个调用同时(a进程挂起时,b进程进来)进来就会造成对象不唯一
*/
/*解决方案1:方法加synchronized关键字
缺点:效率比较低,进来就判断*/
p1:public static synchronized Single getInstance(){
if(null != single)
single = new Single();
return single;
}
/*解决方案2:先判断是否存在对象,不存在 则先给single类加锁,再创建对象,如果存在两个进程同时进来,则二次判断就保证唯一
缺点:代码量增加*/
p2:public static Single getInstance(){
if(null != single){
synchronized(Single.class){
if(null != single)
single = new Single();
}
}
}
}
class SingleDemo{
public static void main(String[] args){
Single single = Single.getInstance();
}
}