设计模式--单例设计模式

首先单例设计模式是为了保证我们应用程序中某个类的实例在内存中只存在一份,应用场景;
1 有些是出于内存消耗的考虑,比如类中数据量比较大的情况,或者说属性较多.
    如果实例一多,内存消耗就多,影响程序的执行效率.
2:有些是为了不引起程序的混淆,必须保证类的实例只能有一份,比如框架的容器,就那spring容器来说,spring容器必须要是单例的,如果不是单例的,那么也就是说同一个数据在容器中存在着多份,会造成程序的复杂性提高;
实现的思路:1 构造函数私有化,将对象的创建权限保留在本类中(反射方式除外)2 在本类内部创建静态实例 3 给外部提供静态方法获取到该实例;
就实例的创建时机来将分为饿汉式和懒汉式.
饿汉式:就是指实例声明即初始化;这个最好理解;
懒汉式:就是延迟初始化,仅仅当获取的时候将实例进行初始化,这个在多线程环境下容易出现线程安全问题,需要有一定的同步机制进行防止;
主要有1 DCL,双重锁机制,用synchronized关键字对对象的初始化进行锁定,保证线程安全问题;
             

public class SingletonsByRWL {
       private static ReadWriteLock rwl = new ReentrantReadWriteLock();
       private static SingletonsByRWL instance = null;

       private SingletonsByRWL() {
        };

       public static SingletonsByRWL getInstance();

  rwl.readLock().lock();
  try {
   if (instance == null) {
    rwl.readLock().unlock();
    rwl.writeLock().lock();
    try {
     instance = new SingletonsByRWL();
    } finally {
     rwl.writeLock().unlock();
    }
    rwl.readLock().lock();
   }
   return instance;
  } finally {
   rwl.readLock().unlock();
  }
 }


                    2 这里给出一个jdk1.5新特性的读写锁机制实现代码这种方式看起来比较繁琐,在给出一个基于jvm底层的懒加载实现方式:

public class Singleton {
private static Singleton instance;


private Singleton() {

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

public static Singleton getInstance() {
return InnerSingleton.INSTANCE;
}
}
基于原理:内部类的加载时机,是仅仅使用到的时候加载,因为内部类也有对应的字节码,内部类被使用到的时候jvm才会加载对应的内部类字节码;
在这里就是仅仅当你调用getInstance方法的时候才加载,并创建Singleton对象;从而做到了懒加载.同时线程安全问题不用考虑,jvm底层提供保证;
这是一种比较优雅的实现单实例的懒加载的方式;
ps:在反射的情况下,private修饰的构造函数可以被暴力反射,从而创建多个对象,如果你要避免这种情况,可以使用SecurityManager机制进行实现,
通常由应用服务器内部的配置实现;
<script type="text/javascript" id="wumiiRelatedItems"> </script>
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值