Java 单例模式[通俗易懂]

Java 单例模式[通俗易懂]单例模式(SingletonPattern)是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。注意:1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。…

大家好,又见面了,我是你们的朋友全栈君。

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

一:注意:

  • 1、单例类只能有一个实例。
  • 2、单例类必须自己创建自己的唯一实例。
  • 3、单例类必须给所有其他对象提供这一实例。

 :一个好的单例模式具有如下特点:

  • 1、是否能被反射破坏,一般均为人为破坏
  • 2、是否是懒加载(Lazy Load),需要时加载,不需要时不加载
  • 3、是否是线程安全的,当多个线程获取的不是同一对象时,就不是线程安全的

三:单例模式分为饿汉式加载与懒汉式加载

1.饿汉式加载:很饿,只要类加载了就进行对象初始化,万一不用?就会浪费性能

例:

public class SingTon1 {
    private SingTon1(){}
    public static SingTon1 singTon1=new SingTon1();
    public  static SingTon1 getInstance(){
        return singTon1;
    }
}

 

public static void main(String[] args) {
    for (int i = 0; i < 20; i++) {
        System.out.println(SingTon1.getInstance());
    }
}

 Java 单例模式[通俗易懂]

 

2.懒汉式加载:很懒,只有真正要获取到这个类对象时进行初始化。虽说懒汉式加载为我们解决了

什么时候需要什么时候加载问题,但是前情提要,一个好的单例模式还需要考虑线程安全问题

而考虑线程安全,我们就会想到多个线程抢锁问题,所以这里采用双检锁思想。

而其中还包含了JVM指令重排序问题

 比如创建一个对象  Object object=new Object(); 有三步:1.开辟空间 2.初始化值 3.赋值
    JVM为提高效率,可能不按顺序来 可能1,3,2,3
    解决方法:
    给SingTon2加一个内存屏障 加一个关键字 volatile

例:

public class SingTon2 {
    private SingTon2() {
    }

    public volatile static SingTon2 singTon2 = null;

    public static SingTon2 getInstance() {
        if (singTon2==null){
            synchronized (SingTon2.class) {
               if (singTon2==null){
                   singTon2=new SingTon2();
               }
            }
        }
        return singTon2;
    }
} 
public class ModeDemo {
    public static void main(String[] args) {
        ThreadPoolExecutor poolExecutor = new
                ThreadPoolExecutor(20, 20, 0, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
        for (int i = 0; i < 20; i++) {
            poolExecutor.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println(SingTon2.getInstance());
                }
            });
        }
    }

}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/156225.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vs2021安装教程_vs2015企业版安装教程

    vs2021安装教程_vs2015企业版安装教程一、学习C/C++语言用什么环境?DevC++很久不在更新,对于C语言的标准支持不够好vc6.0太古老,98年的软件了二、那小编推荐什么大家用什么软件?VS2013及以上版本都行!今天跟大家唠如何安装VS2022(听说VS官网更新了,小伙伴们找不到VS2019了)三、VS2019下载官网VS2022官网https://visualstudio.microsoft.com/zh-hans/?rr=https://www.microsoft.com/zh-cn/3.1点击VS

    2022年9月10日
    0
  • arouter实现activity跳转原理

    arouter实现activity跳转原理一、思路分析arouter让我们可以非常简单地实现组件间页面跳转,实现的基本思路是1.在对应的activity上加上注解,通过apt技术来自动生成代码,代码能将activity对应路径和class添加到路由表中;2.通过扫描获取所有类,遍历自动执行步骤1中所生成地代码,从而路由表中有了对应地数据,路由表的数据结构为Map<String,Class<?e…

    2022年5月21日
    66
  • 线程池如何创建线程_创建线程池的七个参数

    线程池如何创建线程_创建线程池的七个参数Executors如何创建线程池?Executors类是从JDK1.5开始就新增的线程池创建的静态工厂类,它就是创建线程池的,但是很多的大厂已经不建议使用该类去创建线程池。原因在于,该类创建的很多线程池的内部使用了无界任务队列,在并发量很大的情况下会导致JVM抛出OutOfMemoryError,直接让JVM崩溃,影响严重。但是Executors类究竟是如何使用…

    2022年9月27日
    1
  • 北方地区上传报错,incorrect zone, please use up-z1.qiniu.com

    北方地区上传报错,incorrect zone, please use up-z1.qiniu.com

    2022年2月18日
    44
  • iOS的QuickTime Plugin

    当UIWebView播放视频时,可以看到viewhierarchy里有FigPluginView的身影。这个类来自于QuickTimePlugin,plugin的路径为:/Application

    2021年12月24日
    40
  • Java版本历史「建议收藏」

    Java版本历史「建议收藏」Java语言自JDK1.0版本以来经历了许多次更新,也在基本程序库中增加了大量的类别和包。从J2SE1.4开始,Java语言的变动由JavaCommunityProcess(JCP)管理,JCP使用Java规范请求(JavaSpecificationRequests,JSRs)来建议和定义对Java平台内容的新增和修改。Java语言由Java语言规范(JavaLanguageSpecification,JLS)定义,对JLS的更改则根据JSR901(页面存档备份,存于互联网档案馆)管理。

    2022年7月9日
    15

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号