设计模式之单例模式(Singleton)

 见词知意,所谓的单例也就是指只能有一个实例,单例模式最常见的有饿汉式和懒汉式两种。

饿汉式单例类在类初始化时已经自行的初始化了:

public class Singleton1 {
     //私有的默认构造子
     private Singleton1() {}
     //已经自行实例化 
     private static final Singleton1 single = new Singleton1();
     //静态工厂方法 
     public static Singleton1 getInstance() {
         return single;
     }
 }


而懒汉式单例在第一次调用的时候初始化:

 

 public class Singleton2 {
     //私有的默认构造子
     private Singleton2() {}
     //注意,这里没有final    
     private static Singleton2 single=null;
     //静态工厂方法 
     public synchronized  static Singleton2 getInstance() {
          if (single == null) {  
              single = new Singleton2();
          }  
         return single;
     }
 }


 

对于懒汉式的得到实例的方法加的synchronized,是因为如果多个线程在同一时间执行相同的代码,会出现多个实例,不满足单例模式的要求,他是线程不安全的,所以要加上sychronized。
 

在上述示例中,我们把实例的权限设置为了私有的类,这样就防止了使用者直接new一个实例,而即使是private权限也可以通过反射机制的setAccesible来得到这个类的实例,为了防止使用者这样来创建,我们需要在 ReflectPermission("suppressAccessChecks")权限下使用安全管理器(SecurityManager)的checkPermission方法来限制这种突破。一般来说,不会真的去做这些事情,都是通过应用服务器进行后台配置实现。

 

最后 单例模式很难实现序列化,而且不能被别的类继承。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值