• 常见设计模式---单例设计模式


    单例设计模式

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

    饿汉式

    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;
        }
    }
  • 相关阅读:
    理解python多个参数*args
    物联网MQTT 协议测试
    python 自动化测试人工智能
    Django 初识
    算法排序
    python教程笔记GUI wxpython
    python入门教程学习笔记#3 基础部分
    python入门教程学习笔记#1 安装准备
    2012-2013 Northwestern European Regional Contest (NWERC 2012)
    2017 Benelux Algorithm Programming Contest (BAPC 17)
  • 原文地址:https://www.cnblogs.com/wangsr-suc/p/8878225.html
Copyright © 2020-2023  润新知