• 单例模式创建的几种方式


      单例设计模式是我们开发中常用的设计模式,改设计模式可以减少系统的开销,在系统设置全局访问点,共享系统资源,向我们的Spring bean 管理就是单例模式的体现

      而且在日常开发中,也会需要使用到单例模式

      常用的单例模式有:

      1.饿汉式:------>    一旦类初始化就会创建该对象,安全性高,线程是安全的 

    public class Singn {
        
                //static 类加载就创建该类的对象
                private static Singn demo =new Singn();
                //构造方法私有化,外部不能直接创建对象
                private Singn(){
            
                }
                //提供一个公共方法返回对象,提供一个对象提取点
                    public static Singn getInstance(){
                    return demo;
                }

      2.懒汉式 ---------->  线程安全,需要方法同步,并发效率低,单例延时加载,在使用的时候才会去加载判断,所以需要方法的同步

                public class Singn {
        
                //声明对象
                private static Singn demo ;
                //构造方法私有化
                private Singn(){
            
                        }
                //使用时候进行创建对象判断 synchronized 进行同步,没有就创建,有就不创建,在高并发情况下,速度就会大大折扣
                public static synchronized Singn getInstance(){
                    if(demo==null){
                    demo=new Singn();
                    }
                    return demo;
                    }

      3.静态内部类,以为类的加载是天然线程安全的

    public class Singn {
        
                //定义静态内部类
                private static class signInstance{
                private static final Singn sn =new Singn();
                    }
            
                    //私有化构造器
                    private Singn(){
                
                    }
                    //调用内部类方法得到对象
            
                    public static Singn si(){
                        return signInstance.sn;
                    }
                    }

      4,.双重检测锁:

    public class WorkTestEntity {
        
        // 私有化构造对象
        private  WorkTestEntity (){}
        //声明
        private static WorkTestEntity sign;
    
        public static WorkTestEntity getInstance(){
            
            //双重检测机制,当对象为空的时候
            if(sign==null) {
                //防止并发,我们需要再进行加锁判断,对象是不是真的为空,加入同步代码块
                synchronized(WorkTestEntity.class) {
                    
                    if(sign==null) {
                        
                        sign =new WorkTestEntity();
                    }
    
                }
    
            }
            return sign;
            
            
        }
    }
    原创打造,多多指教
  • 相关阅读:
    一次偶然的Java内存溢出引发的思考
    centos6.4下面安装postgresql以及客户端远程连接
    用springMVC构建restful程序,接收以及返回json数据格式
    如何编译spring源码,并导入到eclipse中
    模仿MFC封装Windows API
    一些好用的控制台命令
    014:字符串:各种其奇葩的内置方法
    013:元组:戴上了枷锁的列表
    012:列表:一个打了激素的数组3
    011:列表:一个打了激素的数组2
  • 原文地址:https://www.cnblogs.com/iscys/p/9608591.html
Copyright © 2020-2023  润新知