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

单例设计模式

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

饿汉式

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;
    }
}
原文地址:https://www.cnblogs.com/wangsr-suc/p/8878225.html