栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java单例模式学习笔记

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java单例模式学习笔记

1、单例模式定义

确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。比如:线程池、缓存、日志对象。

2、单例模式的特点

①单例类只能有一个实例
②单例类必须自己创建自己的唯一实例
③单例类必须给所有其他对象提供这一实例

3、单例模式的种类

(1)懒汉式——线程不安全
(2)饿汉式——天生线程安全

懒汉式单例——线程不安全,需要我们改造成线程安全
public class DanLi {

   //通过将构造方法限定为private避免了类在外部被实例化,这样其他处的代码就无法通过调用该类的构造方法来实例化该类的对象,
    // 只有通过该类提供的静态方法getDanLi来得到该类的唯一实例
    private DanLi() {
    }

    //创建静态对象
    private static DanLi danLi = null;

    //在该类内提供一个静态方法
    // 当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用。
    public static DanLi getDanLi() {
        if (danLi == null) {
            danLi = new DanLi();
        }
        return danLi;
    }
}

以上懒汉式单例的实现没有考虑线程安全问题,它是线程不安全的,并发环境下很可能出现多个Singleton实例,要实现线程安全,有以下三种方式,都是对getInstance这个方法改造,保证了懒汉式单例的线程安全。

方式一:在getInstance方法上加同步
public static synchronized DanLi getDanLi() {
        if (danLi == null) {
            danLi = new DanLi();
        }
        return danLi;
    }
方式二:双重检查锁定
public static DanLi getDanLi() {
        if (danLi == null) {
            synchronized (DanLi.class) {
                if (danLi == null) {
                    danLi = new DanLi();
                }
            }
        }
        return danLi;
    }
方式三:静态内部类
public class DanLi {

    //构造方法定义为私有方法,这样其他处的代码就无法通过调用该类的构造方法来实例化该类的对象,
    // 只有通过该类提供的静态方法来得到该类的唯一实例
    private DanLi() {
    }

    //创建静态内部类
    private static class LazyHolder {
        private static final DanLi DAN_LI = new DanLi();
    }

    //创建静态对象
    private static DanLi danLi = null;

    //在该类内提供一个静态方法
    // 当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用。
    public static final DanLi getDanLi() {
        return LazyHolder.DAN_LI;
    }
}
饿汉式单例——线程安全
public class EHanDanLi {
    //创建私有的构造方法
    private EHanDanLi() {
    }

    //在类创建的同时就已经创建好一个静态的对象供系统使用
    private static final EHanDanLi E_HAN_DAN_LI = new EHanDanLi();

    //静态工厂方法
    public static EHanDanLi geteHanDanLi() {
        return E_HAN_DAN_LI;
    }
}

饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。

饿汉式和懒汉式区别

饿汉式天生就是线程安全的,可以直接用于多线程而不会出现问题;

懒汉式本身是非线程安全的。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/839081.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号