1.饿汉式

//线程安全 饿汉式 浪费空间
class HungryMan{private HungryMan(){ System.out.println(Thread.currentThread().getName()); };private final static HungryMan hungryMan=new HungryMan();public static HungryMan getInstance(){ return hungryMan; }
}

2.懒汉式

//线程不安全 懒汉式
class LazyMan{private LazyMan(){ System.out.println(Thread.currentThread().getName()); }private  static LazyMan lazyMan;public static LazyMan getInstance(){if(lazyMan==null){lazyMan=new LazyMan();}return lazyMan;}
}

3.DCL懒汉式

/* 线程安全
双锁校验的懒汉式  DCL懒汉式
指令重排后会出现第二个线程在第一个线程刚实例化之前进入,造成重新实例化对象的问题。
加volatile 避免指令重排
*/
class LazyManAddSync{private static boolean flag=false;private LazyManAddSync(){//有效去除反射if(flag==false){flag=true;}else{throw new RuntimeException("不要使用反射");}//隔离反射 但是如果未实例化对象,直接两次反射,还是会出现反射破坏/*synchronized (LazyManAddSync.class){if(lazyMan!=null){throw new RuntimeException("不要使用反射");}}*/System.out.println(Thread.currentThread().getName());}private volatile static LazyManAddSync lazyMan;public static LazyManAddSync getInstance(){if(lazyMan==null){synchronized (LazyManAddSync.class){if(lazyMan==null){/*非原子性操作分配空间 执行构造方法,初始化对象 把对象指向这个空间如果指令重排,会导致 23换序,引起异常*/lazyMan=new LazyManAddSync();}}}return lazyMan;}
}

4.静态内部类

//线程安全 静态内部类
class SingletonInnerClass {private SingletonInnerClass(){System.out.println(Thread.currentThread().getName()); }public static SingletonInnerClass getInstance(){return InnerClass.sic;}static class InnerClass{private final static SingletonInnerClass sic=new SingletonInnerClass();}
}

5.枚举类

//枚举 反射无法破坏枚举
enum EnumSingel{INSTANCE;public EnumSingel getInstance(){return INSTANCE;}
}

测试类


public class SingleTon {public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {System.out.println("测试单例");for(int i=0;i<10;i++) {new Thread(()->{SingletonInnerClass.getInstance();}).start();}//反射可以破坏单例模式/*System.out.println("反射");LazyManAddSync lazyManAddSync=LazyManAddSync.getInstance();Field flag=LazyManAddSync.class.getDeclaredField("flag");//修改权限flag.setAccessible(true);Constructor<LazyManAddSync> constructor=LazyManAddSync.class.getDeclaredConstructor(null);constructor.setAccessible(true);LazyManAddSync lazyManAddSync1=constructor.newInstance();//修改属性值flag.setBoolean(lazyManAddSync1,false);LazyManAddSync lazyManAddSync2=constructor.newInstance();*//* 枚举类 无法反射Constructor<EnumSingel> constructor=EnumSingel.class.getDeclaredConstructor(String.class,int.class);constructor.setAccessible(true);EnumSingel enumSingel=constructor.newInstance();*/}
}

Java 各种单例模式实现代码相关推荐

  1. Java 设计模式(一)之单例模式 理论代码相结合

    今天就让我们拿Java的单例模式开篇吧,持续更新中. 让我们一起学习设计模式吧,说它是基础也是基础,说它不是,又确实不是.它穿插在各处.学好它也是为了能让自己更进一步. 很喜欢一句话:"八小 ...

  2. Java学习-----单例模式

    一.问题引入 偶然想想到的如果把Java的构造方法弄成private,那里面的成员属性是不是只有通过static来访问呢:如果构造方法是private的话,那么有什么好处呢:如果构造方法是privat ...

  3. Java DCL 单例模式真的需要对变量加 Volatile 吗?

    原文链接:https://zhuanlan.zhihu.com/p/385271959 目录 代码展示 DCL分析 DCL单例变量加volatile关键字的原因 Java对象创建过程 volatile ...

  4. Java 进阶——单例模式

    一.单例模式概念及特点         Java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必 ...

  5. JAVA设计模式-单例模式(Singleton)线程安全与效率

    一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式 ...

  6. Java 设计模式 - 单例模式

    Java 设计模式 - 单例模式 作者: 霍英俊 [huo920@live.com] 文章目录 Java 设计模式 - 单例模式 单例设计模式介绍 单例设计模式八种方式 饿汉式 - 静态常量 饿汉式( ...

  7. java之单例模式祥解

    java之单例模式祥解 收藏 转自javaeye的作者calmness,看完以后我很佩服,他的连接地址: http://www.javaeye.com/topic/60179 概要 单例模式是最简单的 ...

  8. 使用java的API编写代码

    使用java的API编写代码 JavaBean 在Java中,有很多class的定义都符合这样的规范: 若干private实例字段: 通过public方法来读写实例字段. public class P ...

  9. java中单例的应用_浅谈Java中单例模式的几种应用

    目录 浅谈Java中单例模式的几种应用 第一种:懒汉式 第二种:饿汉式 第三种:双重检索式 第四种:注册登记式 第五种:内部类形式 浅谈Java中单例模式的几种应用 日常开发中,为了提高我们系统中对象 ...

  10. Nosql数据库MongoDB 理论+实践(JAVA API操作) 代码实践

    文章目录 一.数据库 数据库的概念: 数据库分类 关系型数据库 非关系型数据库 二.Mongo 存储的数据类型 下载 三个层次 基本指令(shell) 三.Mongo Manager Free 概念 ...

最新文章

  1. 关于python语言、下列说法不正确的是-下列语句中,___________是不正确的Python语句...
  2. hihoCoder#1196 : 高斯消元·二(开关灯问题)
  3. 成员变量和属性区别(@property那点事儿)
  4. VS Code识别编辑规范,ESlint规则,VS Code保存去掉自动加分号、逗号、双引号
  5. 【NLP】Prompt Learning-使用模板激发语言模型潜能
  6. MySQL中order by中关于NULL值的排序问题
  7. php中怎么替换文字,php里面怎么替换文字
  8. 开发者须知:哪些广告最让用户感到厌烦
  9. docker tensorflow_Docker环境下如何使用TensorBoard
  10. 大数据之Hadoop命令
  11. 笔记本电脑f11功能键_电脑技巧:键盘上F功能键F1-F12详解
  12. Hexo+Github免费搭建个人博客+美化详细教程
  13. 串口WriteFile 句柄无效 的解决
  14. Linux作为哑终端连接服务器,linux – TERM =哑终端必须具备的功能
  15. Activiti结合Modeler 可视化操作界面
  16. java中注解 详解
  17. 巨帧(jumbo frame)
  18. 黄芽菜和大白菜的区别 黄芽菜的做法
  19. C语言实现实数和复数矩阵及其各种运算(一)
  20. 线性代数学习笔记4-6:矩阵的四个子空间(零空间、列空间、行空间、左零空间)、初等行变换、测验题

热门文章

  1. vue.js入门以及和echarts整合之柱状图和中国地图
  2. Flash Builder4.7安装
  3. ectouch2.0 php5.5_ectouch: ECTouch是一款开源的电商系统,为中小企业提供最佳的新零售解决方案。...
  4. 做了三年Java,java简历包装项目经验
  5. win11字体模糊不清怎么办 windows1字体模糊不清的解决方法
  6. 无法启动游戏 因为计算机,win7电脑无法启动游戏怎么办?
  7. 一文详解:中信银行java笔试题库
  8. python模拟鼠标拖动滑块_Python中selenium的作用链模拟滑块运动,python,ActionChains,移动...
  9. 对称矩阵的特征值与特征向量
  10. 【Pygame闯关游戏】手残勿入,最新虐心游戏《见缝插针》——不得不玩的一款游戏。