关于面试:常见的8种单例模式

简介:面试常考题之单例模式其实很简略,学过本文之后保障能够迅速且牢固的记住全副的8种单例模式。

8种单例模式

单例的思维

  • 只能有一个实例,以公有构造函数,或者外部类模式。

  • 提供全局拜访 static

应用场景

  • 不便资源之间的相互通信。如线程池等。

  • 防止因为资源操作时导致的性能或损耗等。如数据库连接池等。

动态常量(饿汉)

public class Singleton {
 
 private final static Singleton SINGLETON = new Singleton();
 
 private Singleton(){}
 
 public static Singleton getInstance(){
 return SINGLETON;
 }
}

长处:书写简略,并且防止了线程同步问题。 毛病:在类装载的时候就实现实例化。如果从始至终从未应用过这个实例,则会造成内存的节约。

动态代码块 (饿汉)

public class Singleton {
 
 private static Singleton singleton;
 
 static {
 singleton = new Singleton();
 }
 
 private Singleton() {}
 
 public Singleton getInstance() {
 return singleton;
 }
}

优缺点同上。

非线程平安(懒汉)

public class Singleton {
​
 private static Singleton singleton;
​
 private Singleton() {}
​
 public static Singleton getInstance() {
 if (singleton == null) {
 singleton = new Singleton();
 }
 return singleton;
 }
}

长处:达到懒加载,防止内存节约。 毛病:线程不平安。

线程平安同步代码块(懒汉)

public class Singleton {
​
 private static Singleton singleton;
​
 private Singleton() {}
​
 public static synchronized Singleton getInstance() {
 if (singleton == null) {
 singleton = new Singleton();
 }
 return singleton;
 }
}

长处:达到懒加载,防止内存节约。 毛病:线程并不齐全平安,加载效率低。

线程平安同步办法(懒汉)

public class Singleton {
​
 private static Singleton singleton;
​
 private Singleton() {}
​
 public static Singleton getInstance() {
 if (singleton == null) {
 synchronized (Singleton.class) {
 singleton = new Singleton();
 }
 }
 return singleton;
 }
}

长处:达到懒加载,防止内存节约。 毛病:线程并不齐全平安。

双重查看 (举荐应用)


public class Singleton {
 // 思考此处为什么用volatile? 答:禁止指令重拍
 // 为什么要禁止指令重拍?答:此处设计到jvm类加载机制。加载 链接 初始化。
 // 链接中验证 筹备 解析,在筹备的过程中就开拓了内存,然而真正执行类中定义的java程序代码切实初始化阶段,
 // 初始化实现了对象才不为空。如果指令错乱在多线程的时候就容易呈现多创建对象状况。
 private static volatile Singleton singleton;
​
 private Singleton() {}
​
 public static Singleton getInstance() {
 if (singleton == null) {
 synchronized (Singleton.class) {
 if (singleton == null) {
 singleton = new Singleton();
 }
 }
 }
 return singleton;
 }
}

长处:线程平安,提早加载,效率较高。

外部类(举荐应用)

public class Singleton {
​
 private Singleton() {}
 
 private static class SingletonInstance {
 private static final Singleton INSTANCE = new Singleton();
 }
​
 public static Singleton getInstance() {
 return SingletonInstance.INSTANCE;
 }
}

长处:防止了线程不平安,提早加载,效率高。

枚举(举荐应用)

public enum Singleton {
 INSTANCE;
 public void xxx() { 
 }
}

长处:装的一手好逼。防止了线程不平安,提早加载,效率高。 如果面试中呈现让你手写代码要去写后三种,最好写双重查看。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理