zoukankan      html  css  js  c++  java
  • 设计模式之 单例模式

    单例模式的学习;

    1.懒汉式:

    public class Singleton {

    private static Singleton singleton;

    private Singleton(){};// 私有的.防止通过构造器实例化

    public static synchronized Singleton getInstance(){
    if(singleton == null){
    singleton = new Singleton();
    }
    return singleton;
    }
    }

    加锁方式 上面这种直接加在方法上效率低,等同于下面, 锁住范围过大

    public static Singleton getInstance(){

    synchronized(Singleton.class){
    if(singleton == null){
    singleton = new Singleton();
    }
    }
    return singleton;
    }

    解决方式 双重锁:

    public static Singletom getInstance(){
    if(singleton == null){
    synchronized(Singleton.class){
    if(singleton == null){
    singleton = new Singleton();
    }
    }
    }
    return singleton;
    }

    为什么加双重锁?
    假设我们去掉同步块中的是否为null的判断,有这样一种情况,假设A线程和B线程都在同步块外面判断了synchronizedSingleton为null,结果A线程首先获得了线程锁,进入了同步块,然后A线程会创造一个实例,此时synchronizedSingleton已经被赋予了实例,A线程退出同步块,直接返回了第一个创造的实例,此时B线程获得线程锁,也进入同步块,此时A线程其实已经创造好了实例,B线程正常情况应该直接返回的,但是因为同步块里没有判断是否为null,直接就是一条创建实例的语句,所以B线程也会创造一个实例返回,此时就造成创造了多个实例的情况。

    2.饿汉式
    public class Singleton {

    private static Singleton singleton = new Singleton();

    private Singleton(){};// 私有的.防止通过构造器实例化

    public static Singleton getInstance(){
    return singleton;
    }
    }

    这种线程安全的, 但是类一加载就初始化了, 不管用不用得着. 容易造成内容损耗

    3.登记者模式

    public class Singleton {

    private Singleton(){};// 私有的.防止通过构造器实例化

    public static Singleton getInstance(){
    return InnerSingleton.singleton;
    }

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

    通过内部类实例化. 调用时候才会实例化一次. 静态内部类只有调用的时候才会加载

    这是最好的模式

  • 相关阅读:
    [树状数组]H千万别用树套树
    [可持久化权值线段树上二分] Just h-index
    [大数] 组合数
    [模板]离散化
    [树状数组] Galahad
    [可持久化权值线段树] hdu 6703 array
    python Web抓取(二)selenium模块的使用、对浏览器的按键操作及错误处理
    python 调试大法-大笨蛋的笔记
    从终端运行python程序 模块内变量的作用域、添加模块的搜索路径
    Python组织文件 实践:查找大文件、 用Mb、kb显示文件尺寸 、计算程序运行时间
  • 原文地址:https://www.cnblogs.com/haoerlv/p/7515215.html
Copyright © 2011-2022 走看看