单例设计模式

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

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

一、单例模式的结构

单例模式的主要有以下角色

  • 单例类。只能创建一个实例的类
  • 访问类。使用单例类

二、单例模式的实现

单例设计模式分类两种:

饿汉式:类加载就会导致该单实例对象被创建

懒汉式:类加载不会导致该单实例对象被创建,而是首次使用该对象时才会创建

1.饿汉式-方式1 (静态变量方式)

package com.jmj.pattern.singleton.demo02;/*** 饿汉式 :静态代码块*/
public class Singleton {private Singleton(){}//声明Singleton类型的变量private static Singleton singleton ;//在静态代码块中进行复制static {singleton=new Singleton();}public static Singleton getInstance(){return singleton;}}
package com.jmj.pattern.singleton.demo01;/*** 饿汉式 :静态成员 变量*/
public class Singleton {//1.私有构造方法private Singleton(){};//2.在本类中创建本类对象private static Singleton singleton =new Singleton();//3.提供一个公共的访问方式,让那个外界获取该对象public static Singleton getInstance(){return singleton;}}

2、懒汉式

线程安全

package com.jmj.pattern.singleton.demo03;/*** 懒汉式 线程不安全*/
public class Singleton {private Singleton(){}private static Singleton singleton;//对外提供访问方式public static synchronized Singleton getInstance(){if (singleton==null){singleton=new Singleton();return singleton;}return singleton;}}

双重检查锁

package com.jmj.pattern.singleton.demo04;/*** 懒汉式 双重检查锁方式*/
public class Singleton {private Singleton(){}private static volatile Singleton singleton;//对外提供访问方式public static Singleton getInstance(){//第一次判断,如果instance的值不为null ,不需要抢占锁,直接返回对象if(singleton==null){synchronized (Singleton.class){if (singleton==null){singleton=new Singleton();}}}return singleton;}}

静态内部类方式 

枚举

 序列化反序列化破坏单例模式

package com.jmj.pattern.singleton.demo07;import java.io.*;/*** 测试使用反射破坏单例模式*/public class Client {public static void main(String[] args) throws Exception {
//        writeObject2File();readObject2File();readObject2File();}//从文件读取数据(对象)public static void readObject2File() throws Exception {ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("src/main/resources/static/a.txt"));Singleton singleton = (Singleton) objectInputStream.readObject();System.out.println(singleton);//释放资源objectInputStream.close();}//向文件中写数据 (对象)public static void writeObject2File() throws Exception {Singleton instance = Singleton.getInstance();ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("src/main/resources/static/a.txt"));objectOutputStream.writeObject(instance);objectOutputStream.close();}}
package com.jmj.pattern.singleton.demo07;import java.io.Serializable;/*** 懒汉式 匿名内部类*/
public class Singleton implements Serializable {private Singleton(){}/*** 静态内部类,只会被 在调用里面属性或者  方法的时候,才会被类加载* 类加载的时候才加载  ,final 修饰 不会被修改*/private static class SingletonHolder{private static   Singleton singleton =new Singleton();}//对外提供访问方式public static Singleton getInstance(){return SingletonHolder.singleton;}}

反射破坏单例模式

package com.jmj.pattern.singleton.demo08;import java.io.Serializable;/*** 懒汉式 匿名内部类*/
public class Singleton {private Singleton(){}/*** 静态内部类,只会被 在调用里面属性或者  方法的时候,才会被类加载* 类加载的时候才加载  ,final 修饰 不会被修改*/private static class SingletonHolder{private static   Singleton singleton =new Singleton();}//对外提供访问方式public static Singleton getInstance(){return SingletonHolder.singleton;}}
package com.jmj.pattern.singleton.demo08;import java.lang.reflect.Constructor;/*** 测试使用反射破坏单例模式*/public class Client {public static void main(String[] args) throws Exception {//1.获取Singleton的字节码对象Class<Singleton> singletonClass = Singleton.class;Constructor<Singleton> declaredConstructor = singletonClass.getDeclaredConstructor(null);declaredConstructor.setAccessible(true);Singleton singleton = declaredConstructor.newInstance(null);Singleton singleton1 = declaredConstructor.newInstance(null);Singleton singleton2 = declaredConstructor.newInstance(null);System.out.println(singleton);System.out.println(singleton1);System.out.println(singleton2);}}

序列化反序列化破坏单例模式解决方案

package com.jmj.pattern.singleton.demo07;import java.io.Serializable;/*** 懒汉式 匿名内部类*/
public class Singleton implements Serializable {private Singleton(){}/*** 静态内部类,只会被 在调用里面属性或者  方法的时候,才会被类加载* 类加载的时候才加载  ,final 修饰 不会被修改*/private static class SingletonHolder{private static   Singleton singleton =new Singleton();}//对外提供访问方式public static Singleton getInstance(){return SingletonHolder.singleton;}public Object readResolve(){return SingletonHolder.singleton;}}

反射破解单例模式解决方案:

首先加个静态变量做标志位,然后 在构造里加锁,锁字节码对象,构造方法就被 加了同步锁了

Runtime 源码就是饿汉式单例模式

package com.jmj.pattern.singleton.demo09;import java.io.IOException;
import java.io.InputStream;public class RuntimeDemo {public static void main(String[] args) throws IOException {Runtime runtime = Runtime.getRuntime();long l = runtime.freeMemory();System.out.println(l);//要的是一个命令Process exec = runtime.exec("ipconfig");//调用process对象InputStream inputStream = exec.getInputStream();byte[] bytes = new byte[1024 * 1024 * 1024];int len = inputStream.read(bytes);String s = new String(bytes,0,len,"GBK");System.out.println(s);}
}

它的作用可以使用Java操作操作系统

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/170669.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

纯c语言模拟栈和队列(初学必看)

一、栈(Stack) 1.栈的概念及其结构 栈是一种特殊的线性表&#xff0c;在栈这个结构里&#xff0c;越先存进去的数据越难取出来。 这个结构就像是一个只有一端有打开的容器&#xff0c;越先放进去的球越在底部&#xff0c;想要把底部的球拿出来&#xff0c;就必须先把前面的求…

小程序day05

使用npm包 Vant Weapp 类似于前端boostrap和element ui那些的样式框架。 安装过程 注意:这里建议直接去看官网的安装过程。 vant-weapp版本最好也不要指定 在项目目录里面先输入npm init -y 初始化一个包管理配置文件: package.json 使用css变量定制vant主题样式&#xff0…

Halcon WPF 开发学习笔记(2):Halcon导出c#脚本和WPF初步开发

文章目录 前言HalconC#教学简单说明如何二开机器视觉如何二次开发Halcon导出Halcon脚本新建WPF项目&#xff0c;导入Halcon脚本和Halcon命名空间 前言 我目前搜了一下我了解的机器视觉软件&#xff0c;有如下特点 优点缺点兼容性教学视频(B站前三播放量)OpenCV开源&#xff0…

猫罐头怎么选择?精选的5款口碑好的猫罐头推荐!

猫罐头因其成分约80%为水分&#xff0c;对于不喜欢喝水的猫咪来说&#xff0c;正是可以用来补充水分的替代方案。 而近年来市面上也有越来越多讲究食用安全性的猫罐头&#xff0c;像是强调无添加多余加工品、或是不含谷物成分等的商品。但也因为种类过多&#xff0c;让铲屎官容…

Ansible角色定制实例

目录 角色定制&#xff1a;roles 角色定制实例&#xff1a;利用角色部署wordpress 1.在roles目录下生成对应的目录结构 2.定义配置文件 ①nginx ②php ③mysql ④定义剧本文件 ⑤启动服务 角色定制&#xff1a;roles 对于普通的剧本&#xff08;playbook&#xff09;有…

Jira Software Enterprise Crack

Jira Software Enterprise Crack Jira软件是为您的应用程序组中的每一个成员设计、监控和启动优秀软件的。 策略&#xff1a;生成用户故事和问题&#xff0c;策略冲刺&#xff0c;并在应用程序团队中分配任务。 跟踪&#xff1a;在具有绝对可见性的完整背景下&#xff0c;确定团…

Python---字典---dict

1、为什么需要字典 如果想要存储一个人的信息&#xff0c;姓名&#xff1a;Tom&#xff0c;年龄&#xff1a;20周岁&#xff0c;性别&#xff1a;男&#xff0c;如何快速存储。 person [Tom, 20, 男] 在日常生活中&#xff0c;姓名、年龄以及性别同属于一个人的基本特征。 但…

玩转硬件之Micro:bit的玩法(五)——垃圾分类

垃圾分类&#xff0c;为了美好的明天 垃圾是我们生活中不可避免的产物&#xff0c;每天都有大量的垃圾被丢弃&#xff0c;如果不加以处理&#xff0c;就会给环境和人类带来严重的危害。 垃圾分类是一种有效的垃圾管理方式&#xff0c;它是指按照一定的标准或规则&#xff0c;将…

从单服务设计看SLA保证

文章首发公众号&#xff1a;海天二路搬砖工 0. 引言 在微服务架构中&#xff0c;谈到SLA保证&#xff0c;我们更多是从宏观的角度来需求解决方案。比如&#xff0c;通过合理服务拆分来增加系统整体的可维护性&#xff1b;通过多实例部署来保证系统的灾备。但是单个服务是可靠…

AYIT-ACM实验室发展历程

AYIT-ACM简介 ACM协会为你的梦想插上翅膀。 本院ACM协会成立于2012年 2008年开始小规模参加河南省竞赛 2014年成功实现金牌零突破 指导老师&#xff1a;孙高飞老师 安阳工学院计算机科学与信息工程学院ACM队是一支优秀的队伍&#xff0c;一支充满活力与激情的队伍&am…

网络编程 初探windows编程

目录 一、什么是Winodws编程 二、开发环境搭建以及如何学习 三、VA助手安装 四、第一个Win32程序 五、窗口类句柄/窗口类对象 六、Winodws消息循环机制 七、Windows数据类型 一、什么是Winodws编程 Windows 编程指的是在 Microsoft Windows 操作系统上进行软件开发的过…

加速mvn下载seatunnel相关jar包

seatunnel安装的时候&#xff0c;居然要使用mvnw来下载jar包&#xff0c;而且是从https://repo.maven.apache.org 下载&#xff0c;速度及其缓慢&#xff0c;改用自己本地的mvn下载。 修改其安装插件相关脚本&#xff0c;复制install-plugin.sh重命名为install-plugin-mvn.sh …