欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-05 11:35:47
单例设计模式 饿汉式 懒汉式 双重线程检查式 饿汉式 懒汉式 注意:有线程安全问题 懒汉式 多线程中,可能有多个调用,第一个线程判断为null,于是进行下边,但是在初始化过程中,下一个线程进来,而第一个初始化还没有完成,于是这两个线程都通过null判断 解决方法: 同步 上一个解决的不够完美,但是多 ......

单例设计模式

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

饿汉式

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;
    }
}