单例模式 - Singleton

对今天学习的Singleton简单总结下:

定义:保证一个类只有一个实例,并提供一个访问它的全局访问点。
 · private 构造函数;
 · private static 成员变量:缓存实例;
 · public static 方法:创建类实例;
作用
  - [1]. 保证唯一实例;
  - [2]. 提供对唯一实例的受控访问。

多线程下的单例模式
进程加锁 (懒汉式 -> 饿汉式) –> 双重锁定(Double-Check Locking) –> 静态内部类 –> 枚举

public class Singleton{   // 单例-懒汉式
    private static Singleton instance;
    private Singleton() {}
    public static synchronized Singleton getInstace()
    {
        if(null==instance)
            instance = new Singleton();
        return instance;
    }
}

:同步方法解决多线程问题。仅第一次设置instance需要同步,之后每次调用此方法,同步都是累赘降低性能。


public class Singleton{ // 单例-双重锁定(懒汉式改进版)
    private volatile static Singleton instance;
    private Singleton() {}
    public static Singleton getInstace()
    {
        if(null==instance){
            synchronized(Singleton.class){
                if(null==instance)
                    instance = new Singleton();
            }
        }
        return instance;
    }
}

:确保实例仅在未创建时加锁,亦能保证多线程安全。
volatile:避免内存模型允许的’无序写入’(某个线程可能会获得一个未完全初始化的实例)导致失败。


public class Singleton{   // 单例-饿汉式 
  private static Singleton instance = new Singleton();
  private Singleton() {}
  public static Singleton getInstace()
  {
    return instance;
  }
}

:使用静态初始化(无需显示编写线程安全代码),加载时即实例化,提前占用系统资源。


public class Singleton{  // 静态内部类
    private Singleton() {}
    private static class SingletonHelper{
        private final static Singleton instance = new Singleton();
    }
    public static Singleton getInstace(){
        return SingletonHelper.instance;
    }
} 

:加载时不会初始化静态变量instance,达到延时加载。
  static:成员变量只保存一份副本;
  final:保证变量不可变。


待续 = =

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值