java单例模式

java单例模式

什么是java单例模式?
java单例模式就是任何适合保证为整个程序提供一个实例,避免不一致的状态。

实现的思路就是让构造函数私有化,通过函数返回当前类的实例。

饿汉式单例实现

public class Singleton {  

    private static Singleton instance = new Singleton();  

    private Singleton(){}  

    public static Singleton getInstance() {  
        return instance;  
    }  

}  

通过直接在类中初始化实例,并且设定为static的方式,从而达到只输出一个实例的目的。

懒汉式单例实现

懒汉式单例是指在方法调用获取实例时才创建实例,所以比较懒

public class Singleton {  

    private static Singleton instance = null;  

    private Singleton (){}  

    public static Singleton getInstance() {  
        if(instance == null){    //只有进去的时候才创建实例
            instance = new Singleton ();  
        }  
        return instance;  
    }  
}  

以上代码在单线程中是完全正确的,但是如果正在多线程并发的条件下,如果有几个线程同时进入到了类中,同时进行耗时操作,将会返回多个实例,所以这种用法不适合用于多线程中。

线程安全的懒汉式单例

既然以上的方法存在问题,那我们为了防止产生多个实例,可以在上面加上锁,简单的改动可以让代码能够运行

public class Singleton {  

    private synchronized static Singleton instance = null;  

    private Singleton (){}  

    public static Singleton getInstance() {  
        if(instance == null){    //只有进去的时候才创建实例
            instance = new Singleton ();  
        }  
        return instance;  
    }  
}  

虽然上面的代码实现了线程安全,但是确实牺牲了效率,同步效率很低。

双检查锁机制

public class Singleton {  

    //使用volatile关键字保其可见性  
    volatile private static Singleton instance = null;  

    private Singleton (){}  

    public static Singleton getInstance() {  
        try {    
            if(instance != null){   

            }else{   
                Thread.sleep(300);  
                synchronized (Singleton.class) {  
                    if(instance == null){
                    //二次检查  
                        instance = new Singleton();  
                    }  
                }  
            }   
        } catch (InterruptedException e) {   
            e.printStackTrace();  
        }  
        return instance;  
    }  
}  

以上代码通过同步代码块和volatile关键字,仅仅对 if(instance == null){

                    instance = new Singleton();  
                }  
                方法加锁,从而达到了,效率和安全的作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值