单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
单例模式主要有两种实现方式:
饿汉式:
class Single{
private static final Single s = new Single();
private Single(){}
public static Single getInstance(){
return s;
}
}
顾名思义,程序一运行,就会加载该类实例。
final 关键字可加可不加,加了显得更严谨,表示处于内存中的常量池区域中;
懒汉式:
class Single{
private static Single s = null;
private Single(){}
public static Synchronized Single getInstance(){
if(s == null){
s = new Single();
}
}
}
上面是最原本的懒汉式实现方式,但是同步锁会导致多线程时,每个线程都需要判断资源是否上锁,比较低效,
优化后如下:
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;
}
}
顾名思义,只有程序中需要用到该类的时候,才会去new一个新的类实例。
两种实现方式都可以使用,只不过懒汉式包含更多的知识点,比如面试时常会问:
两种方式有什么区别?
懒汉式采用延迟加载的方式。
多线程时懒汉式会有什么问题,如果有,该怎么解决?
会重复创建实例,可以添加synchronize同步锁。静态代码中的锁是该类所属的字节码对象,同时延迟加载导致创建实例较慢,所以采用双重判断提高效率。