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

设计模式-单例模式

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

设计模式-单例模式

 1.单例模式简介

单例模式:所谓单例模式就是确保某一个类在全局只有一个实例,并且提供一个全局访问的唯一入口(全局任何地方访问该实例,必须通过该入口访问)。

单例模式三个特点:

  • 一、它在全局只有一个实例。

  • 二、该实例创建是在该类内部处理。

  • 三、对外提供全局访问的唯一入口:点。

2.解决了什么问题

有时候某些对象我们只需要一个,如:线程池、缓存、对话框等等,对于这类对象我们只能有一个实例,如果我们制造出多个实例,就会导致很多问题产生。这种场景需要做到两点:

1.全局能访问 2.只有一个实例

备注:全局变量只能满足全局访问,但不能解决只有一个实例的困扰。单例模式能全部解决。

单例模式的优点:

1、节约了系统资源。由于系统中只存在一个实例对象,对与一些需要频繁创建和销毁对象的系统而言,单例模式无疑节约了系统资源和提高了系统的性能。

2、因为单例类封装了它的唯一实例的创建和它的访问方式,所以它可以严格控制客户怎样以及何时访问它该实例

单例模式的缺点:

1,由于单例模式中没有抽象层,因此单例模式不像策略模式一样易于扩展。

2、单例模式可能会因为多线程的问题而带来安全隐患。

3.策略模式结构图

4.特点

全局唯一实例,便于统一管理,也节省了资源

5.单例模式实战

单例模式的常见风险点是:在并发的情况下出现多个实例的创建

5.1 并发情况,线程不安全的单例模式
package main.java.org.example;


public class Mgr03 {
    private static Mgr03 INSTANCE;

    private Mgr03() {
    }

    public static Mgr03 getInstance() {
        if (INSTANCE == null) {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            INSTANCE = new Mgr03();
        }
        return INSTANCE;
    }

    public void m() {
        System.out.println("m");
    }

    public static void main(String[] args) {
        for(int i=0; i<1000; i++) {
            new Thread(()->
                System.out.println(Mgr03.getInstance().hashCode())
            ).start();
        }
    }
}

 结果:

5.2 安全的单例模式写法

 方法1:

package main.java.org.example;


public class Mgr07 {

    private Mgr07() {
    }

    private static class Mgr07Holder {
        private final static Mgr07 INSTANCE = new Mgr07();
    }

    public static Mgr07 getInstance() {
        return Mgr07Holder.INSTANCE;
    }

    public void m() {
        System.out.println("m");
    }

    public static void main(String[] args) {
        for(int i=0; i<100; i++) {
            new Thread(()->{
                System.out.println(Mgr07.getInstance().hashCode());
            }).start();
        }
    }


}

 方法2:最安全的方式

package main.java.org.example;


public enum Mgr08 {

    INSTANCE;
    
    public static void main(String[] args) {
        for(int i=0; i<100; i++) {
            new Thread(()->{
                System.out.println(Mgr08.INSTANCE.hashCode());
            }).start();
        }
    }

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

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

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