java设计模式学习—单例模式

单例模式:保证一个类只有一个实例,并提供一个访问该类的全局访问点
类型:创建类模式
单例模式的特点:
1)构造方法私有;
2)指向自己实例的私有静态引用;
3)以自己实例为返回值的静态公有方法;

/*饿汉式:一开始就加载,以空间换时间**/
public class Singleton{
   /*指向自己的私有静态引用*/
    private static Singleton singleton = new Singleton();
    /*构造方法私有*/
    private Singleton(){};
    /*公有的静态方法,返回值为自己的实例*/
    public static Singleton getInstance(){
         return singleton; 
    }
}
/*懒汉式:延迟加载,用到的时候才加载*/
public class Singleton{
private static Singleton singleton;
private Singleton(){};
public static Singleton getInstance(){
   if(singleton==null){
       singleton = new Singleton();
    }
    return singleton;
}/*该懒汉模式非线程安全*/
public class Singleton{
  private static Singleton singleton;
  private Singleton(){}
  public static synchronized Singleton getInstance(){
       if(singleton==null){
          singleton = new Singleton();
        }
     return singleton;
  }
}/*该懒汉模式线程安全,但效率低*/
public class Singleton{
   private volatile static Singleton singleton;
   private Singleton(){};
   public static synchronized Singleton getInstance(){
       if(singleton==null){
          synchronized(Singleton.class){
              singleton = new Singleton();
          }
       }
       return singleton;
   }/*该模式线程安全且效率较高:称作双重检查锁定*/

单例模式中存在的两个问题:
1)、如果单例类由不同的类加载器载入,那么可能存在多个单例类的实例。一些servlet容器对每个servlet使用不同的类装载器,这样的servtlet访问一个单例类,他们就会有各自的实例;
2)如果Singleton实现了Serializable接口,那么这个类就可能被序列化和还原;(序列化是将对象转化为字节序列的过程,反序列化是将字节序列还原成java对象的过程)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值