剑指offer面试题 2. 实现 Singleton模式
Posted hglibin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer面试题 2. 实现 Singleton模式相关的知识,希望对你有一定的参考价值。
面试题 2. 实现 Singleton模式
- 题目:设计一个类,我们只能生成该类的一个实例。
- 单例模式:确保一个类只有一个实例,并提供了一个全局访问点。
Code
1.饿汉模式
//饿汉模式 public class Singleton1 { //私有化构造方法 private Singleton1(){} private static Singleton1 instance = new Singleton1(); public static Singleton1 getInstance1(){ return instance; } }
2.饿汉模式、变种
//饿汉模式、变种 public class Singleton2 { //私有化构造方法 private Singleton2(){} private static Singleton2 instance = null; static{ instance = new Singleton2(); } public static Singleton2 getInstance2(){ return instance; } }
3.懒汉、线程不安全
//懒汉、线程不安全 public class Singleton3 { //私有化构造方法 private Singleton3(){} private static Singleton3 instance = null; public static Singleton3 getInstance3(){ if(instance==null){ instance = new Singleton3(); } return instance; } }
4.懒汉、线程安全
//懒汉、线程安全 public class Singleton4 { //私有化构造方法 private Singleton4(){} private static Singleton4 instance; public static synchronized Singleton4 getInstance4(){ if(instance==null){ instance = new Singleton4(); } return instance; } }
5.静态内部类
//静态内部类 public class Singleton5 { //私有化构造方法 private Singleton5(){} //静态内部类 private static class SingletonHandler{ private static final Singleton5 INSTANCE = new Singleton5(); } public static Singleton5 getInstance5(){ return SingletonHandler.INSTANCE; } }
6.枚举
//枚举 public enum Singleton6 { INSTANCE; public void whateverMethod() { } }
7.双重校验锁
//双重校验锁 public class Singleton7 { //私有化构造方法 private Singleton7(){} private volatile static Singleton7 instance; public static Singleton7 getInstance7(){ if(instance==null){ synchronized(Singleton7.class){ if(instance==null){ instance = new Singleton7(); } } } return instance; } }
测试类
public class Test { public static void main(String[] args) { Singleton1 instance1 = Singleton1.getInstance1(); Singleton1 instance2 = Singleton1.getInstance1(); System.out.println("单例模式一:"+(instance1==instance2)); Singleton2 instance3 = Singleton2.getInstance2(); Singleton2 instance4 = Singleton2.getInstance2(); System.out.println("单例模式二:"+(instance3==instance4)); Singleton3 instance5 = Singleton3.getInstance3(); Singleton3 instance6 = Singleton3.getInstance3(); System.out.println("单例模式三:"+(instance5==instance6)); Singleton4 instance7 = Singleton4.getInstance4(); Singleton4 instance8 = Singleton4.getInstance4(); System.out.println("单例模式四:"+(instance7==instance8)); Singleton5 instance9 = Singleton5.getInstance5(); Singleton5 instance10 = Singleton5.getInstance5(); System.out.println("单例模式五:"+(instance9==instance10)); Singleton6 instanceOne = Singleton6.INSTANCE; Singleton6 instanceTwo = Singleton6.INSTANCE; System.out.println("单例模式五:"+(instanceOne==instanceTwo)); Singleton7 instance11 = Singleton7.getInstance7(); Singleton7 instance12 = Singleton7.getInstance7(); System.out.println("单例模式七:"+(instance11==instance12)); } }
结果
单例模式一:true 单例模式二:true 单例模式三:true 单例模式四:true 单例模式五:true 单例模式五:true 单例模式七:true
以上是关于剑指offer面试题 2. 实现 Singleton模式的主要内容,如果未能解决你的问题,请参考以下文章
剑指offer编程题Java实现——面试题7相关题用两个队列实现一个栈