单例设计模式,即类只有一个实例,不能在类外部new一个对象.通过代码在类内部创建一个对象,并提供访问方法.
一般创建单例模式的步骤:
1.在本类中实例化一个对象
2.提供访问该对象的接口
3.构造函数私有化,其他类不能实例化该类对象
单例的创建方式有两种:懒汉式和饿汉式
面试一般都考懒汉式
1.饿汉式
顾名思义,就是不管你用不用到,我先给你new一个对象
代码实现:
public class SingleHun {
//饿汉式实现
//new一个对象
private static final SingleHun s = new SingleHun();
//构造函数私有化,外部不能实例化该类
private SingleHun() {}
//向外部提供访问接口
public static SingleHun getInstance() {
return s;
}
}
2.懒汉式
与饿汉式相反,等你什么时候用,我就什么时候给你new对象,实例化的延时执行:
初步代码(可能出现问题):
public class SingleLazy {
//懒汉式实现
private static SingleLazy s = null; //这里不能用final关键字修饰
private SingleLazy() {}
public static SingleLazy getInstance() {
if(s==null) {
//这里可能会出现问题,多线程中如果有多个线程卡在if语句中,
//就可能new出多个对象,不安全
s = new SingleLazy();
}
return s;
}
}
解决方式一,设置同步函数:
这种解决方式虽然简单明了,但是降低了代码效率,给函数加锁就限制了代码的执行速度
public class SingleLazy {
//懒汉式实现
private static SingleLazy s = null; //这里不能用final关键字修饰
private SingleLazy() {}
//给函数加锁,只要有一个线程进去,没出来,其他线程就不能进去
public synchronized static SingleLazy getInstance() {
if(s==null) {
s = new SingleLazy();
}
return s;
}
}
解决方式二,设置同步代码块:
public class SingleLazy {
//懒汉式实现
private static SingleLazy s = null; //这里不能用final关键字修饰
private SingleLazy() {}
public static SingleLazy getInstance() {
if(s==null) {
//同步代码块
synchronized(SingleLazy.class) {
if(s==null)
s=new SingleLazy();
}
}
return s;
}
}