Singleton 模式

有这样一种类,它在整个系统中只存在一个实例.[中国这个类,地球这个类]

 

而保证这个类只有一个实例,是类设计者的责任,而不是类的使用者.

 

保证只有一个实例:

private constructor.

** 不要实现Cloneable和Serializable接口.

 

提供一个全局的访问点:

public static access method.

 

多线程安全?

 

 

 如果Class的实例化的开销不大,可以在类加载的时候就实例化一次,且仅仅一次)

     1.Eager
  public class EagerInitialization {
  private static Resource resource = new Resource();
  public static Resource getResource() {
  return resource;
  }
  static class Resource {
  }
  }
  2.Lazy
  public class SafeLazyInitialization {
  private static Resource resource;
  public synchronized static Resource getInstance() {
  if (resource == null)
  resource = new Resource();
  return resource;
  }
  static class Resource {
  }
  }
  3.double checked locking singleton ( 仅适用于java 5.0 以上版本)
  public class DoubleCheckedLockingSingleton {
  //java5.0 修改了内存模型, 可以保证使用volatile 声明的变量对于double checked locking是正确的
  private volatile static DoubleCheckedLockingSingleton uniqueInstance;
  private DoubleCheckedLockingSingleton() {}
  public static DoubleCheckedLockingSingleton getInstance() {
  if (uniqueInstance == null) {
  synchronized (DoubleCheckedLockingSingleton.class) {
  if (uniqueInstance == null) {

      // temp = new DoubleCheckedLockingSingleton();
      // uniqueInstance = temp; [通过这样会更安全,JVM的原子性保证]
  uniqueInstance = new DoubleCheckedLockingSingleton();
  }
  }
  }
  return uniqueInstance;
  }
  }
  4.Lazy initialization holder class idiom
  public class ResourceFactory {
  //增加一个helper类来初始化对象
  private static class ResourceHolder {
  public static Resource resource = new Resource();
  }
  public static Resource getResource() {
  return ResourceFactory.ResourceHolder.resource;
  }
  static class Resource {
  }
  }

      根据Classloader的原则,一个类在其信息被需要用到的时候才被JVM加载,resource只有在调用getResource的时候才初始化.

 

Singleton 的扩展:

Singleton 的核心是如何控制用户使用new对一个类的实例化.

N个实例-->对象池.

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值