zoukankan      html  css  js  c++  java
  • Java 单例总结

    1:懒汉式,不保证线程安全

    package com.yan.singleton;
    
    public class LazySingleton {
    
        private static final LazySingleton instance = null;
        
        private LazySingleton(){}
        
        public static LazySingleton getLazySingleton(){
            if(null==instance){
                return new LazySingleton();
            }
            
            return instance;
        }
    }

    2:饿汉式,线程安全

    package com.yan.singleton;
    
    public class HungrySingleton {
        private HungrySingleton(){}
        
        private static final HungrySingleton instance = new HungrySingleton();
        
        public static HungrySingleton getInstance(){
            return instance;
        }
    }

    3:静态内部类,线程安全

    package com.yan.singleton;
    
    public class InnerClassSingleton {
        
        private InnerClassSingleton(){}
        
        public static final InnerClassSingleton getInstance(){
            return InnerClassSingletonHolder.INSTANCE;
        }
        
        private static class InnerClassSingletonHolder{
            private static final InnerClassSingleton INSTANCE = new InnerClassSingleton();
        }
    }

    4:枚举,线程安全,可以反序列化(推荐此种方式)JDK1.5之后才可以使用

    package com.yan.singleton;
    
    public enum EnumSingleton {
    
        INSTANCE;
        
        public void todo(){
            System.out.println("todo");
        }
    }

    方式1,2,3都可以使用反射机制来破坏其单例特性,采用枚举类型可以避免反射的破坏。

    例如:

    package com.yan.test;
    
    import com.yan.singleton.LazySingleton;
    import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationTargetException;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    public class Test {
        
        public static void main(String[] args) {
            
            Constructor<LazySingleton>cs ;
            
            try {
                cs = (Constructor<LazySingleton>)
                        Class.forName("com.yan.singleton.LazySingleton")
                                .getDeclaredConstructor();
                
                cs.setAccessible(true);//得到私有访问权限,如果不设置,则无法实例化对象
                    
                LazySingleton ls = cs.newInstance();
                
                System.out.println("===ls:"+ls);
                System.out.println("===ls:"+cs.newInstance());
                
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
            }catch (SecurityException ex) {
                Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
            } catch (InstantiationException ex) {
                Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IllegalArgumentException ex) {
                Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
            } catch (InvocationTargetException ex) {
                Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
            } catch (NoSuchMethodException ex) {
                Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
            }
            
        }
    
    }
  • 相关阅读:
    SA 的参数
    superobject中 JavaToDelphiDateTime的使用
    关于Linux下进程间使用共享内存和信号量通信的时的编译问题
    Linux匿名管道与命名管道
    C++复数四则运算的实现
    C++类编程(一)const的使用
    读书会思考与学期总结
    xenomai安装
    Xenomai 安装准备工作
    Xenomai
  • 原文地址:https://www.cnblogs.com/yshyee/p/4420831.html
Copyright © 2011-2022 走看看