zoukankan      html  css  js  c++  java
  • 常见设计模式---单例设计模式

    单例设计模式

    • 饿汉式
    • 懒汉式
    • 双重线程检查式

    饿汉式

    public class Person {
        
        private static final Person person=new Person();//常量  在第一次加载这个类时就有了  没法改变
        private String  nameString;
        public String getNameString() {
            return nameString;
        }
        public void setNameString(String nameString) {
            this.nameString = nameString;
        }
        //构造私有化
        private Person(){
            
        }
        public static Person getPerson(){
            
            return person;
        }
    }

    懒汉式

    注意:有线程安全问题-----------------------------------懒汉式

    多线程中,可能有多个调用,第一个线程判断为null,于是进行下边,但是在初始化过程中,下一个线程进来,而第一个初始化还没有完成,于是这两个线程都通过null判断

    public class Person {
        
        private static Person person;
        private String  nameString;
        public String getNameString() {
            return nameString;
        }
        public void setNameString(String nameString) {
            this.nameString = nameString;
        }
        //构造私有化
        private Person(){
        }
        public static Person getPerson(){//通过if判断--------------
            if (person==null) {
                person=new Person();
            }
            return person;
        }
    }

    解决方法:

    同步

    public class Person {
        
        private static Person person;
        private String  nameString;
        public String getNameString() {
            return nameString;
        }
        public void setNameString(String nameString) {
            this.nameString = nameString;
        }
        //构造私有化
        private Person(){
        }
        public static synchronized Person getPerson(){//加锁
            if (person==null) {
                person=new Person();
            }
            return person;
        }
    }

    上一个解决的不够完美,但是多线程中还是存在线程安全

    public static synchronized Person getPerson(){//这个代码中,只有person=new Person();被执行一次,因此为了高效率  无需将整个方法同步
            if (person==null) {
                person=new Person();
            }
            return person;
        }

    重点:

    public static  Person getPerson(){
            if (person==null) {
                synchronized (Person.class) {
                    person=new Person();
                }
                
            }
            return person;
        }

    双重线程检查式

    也涉及到线程安全问题,有可能两个方法几乎同时踏进if判断中,但是在return过程中,第一个还没完,第二个可能通过锁所以还需进行判断:

    public class Person {
        private static Person person;
        private String  nameString;
        public String getNameString() {
            return nameString;
        }
        public void setNameString(String nameString) {
            this.nameString = nameString;
        }
        //构造私有化
        private Person(){
        }
        public static  Person getPerson(){
            if (person==null) {
                synchronized (Person.class) {
                    if (person==null) {
                        person=new Person();
                        
                    }
                }
                
            }
            return person;
        }
    }
  • 相关阅读:
    21 jsp——jsp中的相对路径和绝对路径
    20 jsp——jsp的九大内置对象
    19 jsp——jsp的转发标签
    18 jsp——静态引入和动态引入
    17 jsp——全局代码,局部代码
    【zabbix告警监控】配置zabbix监控nginx服务
    【nagios监控】基于linux搭建nagios监控
    【zabbix监控问题】记录zabbix控制面板报错及日志报错的解决方法
    【docker构建】基于docker构建rabbitmq消息队列管理服务
    【docker构建】基于docker搭建redis数据库缓存服务
  • 原文地址:https://www.cnblogs.com/wangsr-suc/p/8878225.html
Copyright © 2011-2022 走看看