java设计模式学习(四):单例模式

   单列模式:确保一个类只有一个实例,并提供一个全部访问点。单例模式主要应用于线程池、缓存中。单例模式主要有两种:懒汉模式和饿汉模式:

饿汉模式:

public class Singleton {

    private static Singleton singleton=new Singleton();
    
    private Singleton(){}
    
    public static Singleton getInstance(){
        return singleton;
    }
    
}
懒汉模式:

public class SluSigleton {

    private static SluSigleton singleton=null;
    
    private SluSigleton(){}

    public static SluSigleton getInstance(){
        
        if(null == singleton){
            singleton=new SluSigleton();
        }
        return singleton;
    }
}
上面的代码会有问题,并不能保证一定只有一个实例,需要改进

public class SluSigleton {

    private static SluSigleton singleton=null;
    
    private SluSigleton(){}
    /**
     * 多线程时,由于资源竞争,会导致创建多个实例,所以需要加锁
     * 这样会造成一定的负担,每次请求都要同步
     * @return
     */
    public static synchronized SluSigleton getInstance(){
        
        if(null == singleton){
            singleton=new SluSigleton();
        }
        return singleton;
    }
}
但是上面的代码会造成效率下降,可以对其进行改进

public class LockSigleton {

    private volatile static LockSigleton sigleton;
    
    private LockSigleton(){}
    
    public static LockSigleton getInstance(){
        if(null == sigleton){
            synchronized (LockSigleton.class) {
                if(null == sigleton){
                    sigleton=new LockSigleton();
                }
            }
        }
        return sigleton;
    }
}
这个做法可以大大缩减getInstance()的时间。这个做法需要JDK在1.4以上。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值