java设计模式(1/23)-单例模式(Singleton pattern)

java创建型模式之一:

单例模式(Singleton pattern)

 

什么是设计模式?

是一套被反复使用、多人知晓的、经过分类编目的代码设计经验的总结。

使用设计模式是为了可重用代码,让代码更容易被他人理解、保证代码的可靠性。

 

有些对象我们只需要一个,比如:配置文件工具类线程池缓存日志对象等,如果创造了多个实例,就会导致许多问题,如:占用过多资源、结果不一致等。

应用场景:有些对象只需要一个就足够了

作用:保证整个应用程序中某个实例有且只有一个

类型:饿汉式、懒 汉式

 

饿汉模式

第一步:私有化构造方法;

第二步:创建唯一的一个实例,使用privatestatic修饰;

第三步:提供一个用于获取实例的方法,使用public static修饰

------(不管用户是否需要,只要类加载,就会去创建该单例模式的对象,即假设总是处于饥饿状态)

 

package Singleton;
public class Singleton {
    //step1
    private Singleton() { }
    //step2
    private static Singleton instance = new Singleton();
    //step3
    public static SingletongetInstance(){
        return instance;
    }
}


懒汉模式

第一步:(同上);

第二步:声明唯一的一个实例,使用privatestatic修饰;

第三步:提供一个用于获取实例的方法,使用public static synchronized修饰

------(注意线程安全问题)

package Singleton;
public class Singleton {
    //step1
    private Singleton() { }
    //step2
    private static Singleton instance =null;
    //step3
    public static synchronized Singleton getInstance(){
        if(instance==null){
            instance=new Singleton();
        }
        return instance;
    }
}

 

 

二者区别

1.速度问题:饿汉式加载慢,运行时获取对象快;懒汉模式加载类比较快,运行时获取对象慢。

2.安全问题:不加synchronized时,懒汉模式线程不安全。

 

改进懒汉-双重判断实例法:

当然,使用synchronized后,解决了懒汉式的安全问题,但示例的方法由于需要频繁的判断锁,损失了一些效率,可以使用下述方法(双重判断实例法)替代step3:

public static Singleton getInstance() { 
        /*
         * 如果第一个线程获取到了单例的实例对象, 后面的线程再获取实例的时候不需要进入同步代码块中了
         */ 
        if (instance== null) { 
            // 同步代码块用的锁是单例的字节码文件对象,且只能用这个锁 
            synchronized (Singleton.class) { 
               if (instance == null) { 
                   instance = new Singleton(); 
               } 
           } 
        } 
        return instance ; 
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值