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

本文详细介绍了单例设计模式中的饿汉式、懒汉式及双重线程检查式三种实现方式,并针对每种方式的特点进行了说明,特别是对于线程安全问题给出了具体的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单例设计模式

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

饿汉式

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值