单例模式
一个类只能创建一个实例化对象,为了保证只能创建一个对象,构造器私有化设置为private,外部不能创建对象,只能提供一个static修饰的公有化方法用于返回唯一的实例。
单例模式有哪些
饿汉式
1.私有化构造器
private Bank(){}
2.为内部提供一个当前类的实例
private static Bank bank = new Bank();
3.提供一个静态方法,返回唯一的对象
public static Bank getInstance(){
return bank;
}
懒汉式
1.创建一个私有化构造器
private Ordor(){};
2.为内部提供一个当前的实例
private static Ordor ordor = null;
3.提供一个静态方法,返回唯一对象
public static Ordor getInstance(){
if(ordor = null){//如果还没有创建对象,就创建一个
ordor = new Ordor();
}
return ordor;//如果之前创建过对象,就返回那个对象
}
由于懒汉式会出现线程安全处理,可以使用用synchronized包装处理
public class SafeSingleton {
private static SafeSingleton singlenton = null;
public static SafeSingleton getInstence(){
if(singlenton == null){//双重检查锁定
synchronized(SafeSingleton.class){
if(singlenton == null){
singlenton = new SafeSingleton();
}
}
}
return singlenton;
}
}
为什么要双层检查锁定?
答:假设有两个线程A和B,此时singlenton = null,当A拿了锁但还没创建对象时,B通过了第一个if判断,正在等待A归还锁,当A创建对象后,将锁归还,B进入第二个if判断,如果没有第二次检查,B将又会创造一个对象。
区别
饿汉式
1.天然线程安全
2.加载早,创建的对象在内存中存活时间过长(提前创建对象,但还没用,就占用内存)
懒汉式:
1.需要做线程安全处理
2.晚加载,需要的时候再创建对象(减少系统开销)
单例模式的使用场景
1.网站计数器
网站计数器只需要一个就够了‘-’
2.数据库连接池
3.读取配置文件的类
4.windows的资源管理器