设计模式之单例

设计模式之单例

单例模式:确保一个类只有一个实例并提供一个对它的全局访问指针

什么是线程安全?

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
或者说:一个类或者程序所提供的接口对于线程来说是原子操作,或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题,那就是线程安全的。

懒汉式单例

    public class Singleton {  
       private Singleton() {}  
       private static Singleton single=null;  

       public static Singleton getInstance() {  
        if (single == null) {    
           single = new Singleton();  
         }    
        return single;  
      }  
    } 

懒汉式只有在调用getInstance的时候,才回去初始化这个单例,它是线程不安全的,并发环境下很可能出现多个Singleton实例,要实现线程安全,有以下三种方式,都是对getInstance这个方法改造,保证了懒汉式单例的线程安全

在getInstance方法上加同步

    public class Singleton {  
       private Singleton() {}  
       private volatile static Singleton single=null;  

       public synchronized static Singleton getInstance() {  
        if (single == null) {    
           single = new Singleton();  
         }    
        return single;  
      }  
    } 

双重检查锁定

    public class Singleton {  
       private Singleton() {}  
       private volatile static Singleton single=null;  

       public static Singleton getInstance() {  
        if (singleton == null) {    
               synchronized (Singleton.class) {    
                    if (singleton == null) {    
                     singleton = new Singleton();   
                    }    
                }    
            }    
        return single;  
      }  
    } 

静态内部类

    public class Singleton {    
        private static class LazyHolder {    
           private static final Singleton INSTANCE = new Singleton();    
        }    
        private Singleton (){}    
        public static final Singleton getInstance() {    
           return LazyHolder.INSTANCE;    
        }    
    } 

饿汉式单例

    public class Singleton {  
        private Singleton() {}  
        private static final Singleton single = new Singleton();  

        public static Singleton getInstance() {  
            return single;  
        }  
    }

饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,所以线程安全

枚举

public enum Singleton{
    INSTANCE;
    public void Singleton(){
    }
}

这个思想直接源于Joshua Bloch的《Effective Java》(《Java高效编程指南》),不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值