剑指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实现——面试题9斐波那契数列

剑指offer编程题Java实现——面试题7相关题用两个队列实现一个栈

《剑指Offer——面试题9:用两个栈实现队列》代码

校招面试 之 剑指offer第9-2题 用两个队列实现一个栈

剑指Offer面试题16. 数值的整数次方

剑指Offer面试题16. 数值的整数次方