java 单例模式实现的5种方式[通俗易懂]

java 单例模式实现的5种方式[通俗易懂]第一种:饿汉式/***CreatedwithIntelliJIDEA.**@author:宸濯*Date:2021/08/188:21*Description:单例模式的设计(饿汉式)*1.构造方法私有化*2.在静态语句块实例化*3.提供调用实例对象的方法*4.空间换时间,不管有没有调用方法,实例都创建了*Version:V1.0*/publicclassSingletonOne{privatestatic

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

第一种:饿汉式

/** * Created with IntelliJ IDEA. * * @author: 宸濯 * Date: 2021/08/18 8:21 * Description:单例模式的设计(饿汉式) * 1.构造方法私有化 * 2.在静态语句块实例化 * 3.提供调用实例对象的方法 * 4.空间换时间,不管有没有调用方法,实例都创建了 * Version: V1.0 */
public class SingletonOne { 
   

    private static final int THREADS=100;
    private static SingletonOne instance;
    /** * 构造方法私有化 */
    private SingletonOne(){ 
   }

    static { 
   
        instance=new SingletonOne();
    }

    public static SingletonOne getInstance(){ 
   
        return instance;
    }

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

第二种:懒汉式

/** * Created with IntelliJ IDEA. * @author: 宸濯 * Description:单例模式设计(懒汉式) * 1.构造方法私有化 * 2.在调用时判断是否实例化 * 3.时间换空间,调用方法时创建实例对象 */
public class SingletonTow { 
   

    private static SingletonTow instance;
    private static final int THREADS=100;
    private SingletonTow(){ 
   }

    public static SingletonTow getInstance(){ 
   

        if (instance==null){ 
   
            instance=new SingletonTow();
        }
        return instance;
    }

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

第三种:双检锁式

/** * Created with IntelliJ IDEA. * @author: 宸濯 * Description:单例模式设计(双检锁懒汉式) * 1.构造方法私有化 * 2.在调用时判断是否实例化 * 3.时间换空间,调用方法时创建实例对象 */
public class SingletonTow { 
   
    /** * volatile修饰符防止指令重排序 */
    private static volatile SingletonTow instance;
    private static final int THREADS=100;
    private SingletonTow(){ 
   }

    public static SingletonTow getInstance(){ 
   

        if (instance==null){ 
   
            synchronized (SingletonTow.class){ 
   
                //双重判定,防止高并发,不过会导致指令重排序
                if (instance==null){ 
   
                    instance=new SingletonTow();
                }
            }
        }
        return instance;
    }

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

java并发编程:volatile关键字解析

第四种:静态内部类式

/** * Created with IntelliJ IDEA. * * @author: 宸濯 * Description:设计单例模式 * 1.构造方法私有化 * 2.静态内部类实例化对象 * 3.静态内部类只会被加载一次,类加载的初始化阶段是单线程的,没有高并发带来的冲突 */
public class SingletonThree { 
   

    /** * 声明线程数 */
    private static final int THREADS=100;
    private static class Inner{ 
   
        private static final SingletonThree INSTANCE=new SingletonThree();
    }

    private SingletonThree(){ 
   }

    public static SingletonThree getInstance(){ 
   
        return Inner.INSTANCE;
    }

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

第五种:枚举类型

/** * Created with IntelliJ IDEA. * @author : 宸濯 */
public enum  SingletonFour { 
   

    //枚举类型设计单例模式
    SINGLETON_FOUR;

    public void test(){ 
   
        System.out.println("hello world");
    }

}

public class Main { 
   
    public static void main(String[] args) { 
   
        SingletonFour.SINGLETON_FOUR.test();
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

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


相关推荐

  • latex 希腊字母加粗_latex加大文字

    latex 希腊字母加粗_latex加大文字HowtoboldGreekletterinlatex?\mathbf{}worksforgeneralletter,butnotworkforGreekletter.IfwewanttoboldGreekletterinlatex,wecanuse\bm{*}or\boldsymbol{*}Forexample,\bm{\sigma}\boldsymbol{\beta}.\documentclass[paper=a4,font

    2022年10月9日
  • JsonPath用法详解

    JsonPath用法详解JSONPath是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括Javascript、Python、PHP和Java。JSONPath的安装方法如下:pipinstalljsonpathJSONPath语法和XPATH语法对比JSON结构清晰,可读性高,复杂度低,非常容易匹配。JSONPath的语法与Xpath类似,如下表所示为JSONPath与XPath语法对比。下面使用一个JSON文档演示JSONPath的具体使用。JSON文档的内容如下:{

    2022年6月19日
  • 信不信十分钟让你彻底搞懂java反射[通俗易懂]

    信不信十分钟让你彻底搞懂java反射[通俗易懂]自从搞懂java反射,我是越来越觉得这破公司容不下我了

    2022年7月26日
  • react路由权限设置

    react路由权限设置说明在react项目中有时我们的一些页面需要权限才能访问,这里以需要登录才能访问进行的设置在这里可以看到权限页面和关于页面是需要登录才能访问的importReact,{Component,useState,useEffect,useRef}from’react’;import{HashRouterasRouter,Route,NavLink,Redirect,Switch,useHistory}from”react-router-dom”;classAPP

    2022年5月6日
  • C语言 条件运算符(? : )的用法[通俗易懂]

    C语言 条件运算符(? : )的用法[通俗易懂]条件运算符(?:)是一个三目运算符,即有三个操作数。使用条件运算符(?:)可以实现IfElse的功能,其一般形式为:          表达式1?表达式2:表达式3其意思是:如果表达式1为真,则运算表达式2,整个条件表达式的值为表达式2的值;反之,则运算表达式3,整个条件表达式的值为表达式3的值。

    2022年10月2日
  • Unity3d菜鸟入门的学习路线–笔记1

    Unity3d菜鸟入门的学习路线–笔记1最近刚刚开始接触unity3d,因此想把自己的学习路线记录下来,方便自己以后总结。由于毕业论文的关系,需要使用Unity3D开发,做虚拟现实的应用,使用的设备是HTCvivepro产品。初始学习,由于没有基础,因此一团乱,总结一下目前看过的教程和书籍。1、开始看的是b站上极客学院讲解的unity3d的入门课程,对操作的界面有了初步的了解,不需要看完,看到编程之前就可以。2、由于需要使用C#编程…

    2022年9月13日

发表回复

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

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