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;
        }
    }
  • 相关阅读:
    godaddy 亚太机房 更换 美国机房 全过程(图)
    博客园设置访问密码
    GoDaddy Linux主机支持机房的更换
    今天电信宽代终于装上光纤了,升级或安装光纤需购光猫,可以自购。我来扫盲一下
    我来科普一下为毛很多人升级了20M的电信光纤宽带反而感觉速度更卡了
    百度浏览器使用率统计
    hdu 1281
    C#基于SMTP协议和SOCKET通信,实现邮件内容和附件的发送,并可隐藏收件人
    如何处理标注打架
    提高你的Java代码质量吧:谨慎包装类型的比较
  • 原文地址:https://www.cnblogs.com/wangsr-suc/p/8878225.html
Copyright © 2011-2022 走看看