java面试题 单例设计模式
Posted weiikun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java面试题 单例设计模式相关的知识,希望对你有一定的参考价值。
单例设计模式
- 某个类必须只有一个实例 (构造器私有化)
- 类必须自行创建实例(含有一个该类的静态变量存储该实例)
- 类自行向其他类提供这个实例 (对外提供获取该实例对象的方式)
饿汉式
在类初始化的时候直接创建对象 不存在线程安全问题
1、直接实例化饿汉式(简洁直观)
2、静态代码块饿汉式(适合复杂实例化)
3、枚举式(最简洁)
1
1 public class Singleton1 2 public final static Singleton1 singleton = new Singleton1(); 3 4 private Singleton1() 5 6 7
2
1 public enum 枚举 2 // 实例变量名 3 instance 4
3
public class Singleton2 public final static Singleton2 INSTANCE; static INSTANCE = new Singleton2(); private Singleton2()
public class Singleton2
public final static Singleton2 INSTANCE;
private String ss
static
info =从文件中获得数据
INSTANCE = new Singleton2("info");
private Singleton2(String s)
this.ss=s;
懒汉式:延迟创建对象
4、线程不安全式(适用于单线程)
5、双重校验式,线程安全(适用于多线程)
6、静态内部类式(适用于多线程)
//线程不安全
public class s 2 3 private static s instance; 4 private s() 5 6 public static s getInstance() 7 if (instance==null) 8 instance=new s(); 9 10 return instance; 11 12
//线程安全版 public class s2 private s2() private static s2 instance; public static s2 getInsatnce() if(!instance==null) synchronized(s2.class) if(instance==null) instance=new s2(); return instance;
1 //在内部类被加载和初始化的时候 才创建instance实例对象 2 //静态内部类不会随着外部类的加载和初始化而初始化 它需要单独去加载和初始化 3 //因为是在内部类加载和初始化的时候才加载和创建的 因此是线程安全的 4 public class s3 5 6 private s3() 7 8 private static class Inner 9 private static final s3 instance =new s3(); 10 11 12 public static s3 getInstance() 13 14 return Inner.instance; 15 16
以上是关于java面试题 单例设计模式的主要内容,如果未能解决你的问题,请参考以下文章
Java面试题之在多线程情况下,单例模式中懒汉和饿汉会有什么问题呢?