哪里学网站建设推广上海网站域名注册价格

web/2025/9/27 8:56:16/文章来源:
哪里学网站建设推广,上海网站域名注册价格,企业网站设计中常见的排版类型,wordpress首个段落摘要文章目录 一、创建型模式1. 单例设计模式1.1 单例模式的结构1.2 单例模式的实现#xff08;1#xff09;饿汉式-方式1#xff08;静态变量方式#xff09;#xff08;2#xff09;饿汉式-方式2#xff08;静态代码块方式#xff09;#xff08;3#xff09;懒汉式-方… 文章目录 一、创建型模式1. 单例设计模式1.1 单例模式的结构1.2 单例模式的实现1饿汉式-方式1静态变量方式2饿汉式-方式2静态代码块方式3懒汉式-方式1线程不安全4懒汉式-方式2线程安全5懒汉式-方式3双重检查锁6懒汉式-方式4静态内部类方式7枚举方式 1.3 存在的问题1序列化与反序列化破坏单例模式2反射破坏单例模式 1.4 问题的解决1序列化与反序列方式破坏单例模式的解决方法2反射方式破解单例模式的解决方法 1.5 JDK源码解析-Runtime类1通过源代码查看使用的是哪种单例模式2使用Runtime类中的方法 一、创建型模式 创建型模式的主要关注点是“怎样创建对象”它的主要特点是“将对象的创建与使用分离”。 这样可以降低系统的耦合度使用者不需要关注对象的创建细节。 创建型模式分为 单例模式工厂方法模式抽象工程模式原型模式建造者模式 1. 单例设计模式 单例模式Singleton Pattern是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类该类负责创建自己的对象同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式可以直接访问不需要实例化该类的对象。 1.1 单例模式的结构 单例模式的主要有以下角色 单例类。只能创建一个实例的类访问类。使用单例类 1.2 单例模式的实现 单例设计模式分类两种 饿汉式类加载就会导致该单实例对象被创建 懒汉式类加载不会导致该单实例对象被创建而是首次使用该对象时才会创建 1饿汉式-方式1静态变量方式 /*** 饿汉式* 静态变量创建类的对象*/ public class Singleton {//私有构造方法private Singleton() {}//在成员位置创建该类的对象private static Singleton instance new Singleton();//对外提供静态方法获取该对象public static Singleton getInstance() {return instance;} }说明 该方式在成员位置声明Singleton类型的静态变量并创建Singleton类的对象instance。instance对象是随着类的加载而创建的。如果该对象足够大的话而一直没有使用就会造成内存的浪费。 2饿汉式-方式2静态代码块方式 /*** 恶汉式* 在静态代码块中创建该类对象*/ public class Singleton {//私有构造方法private Singleton() {}//在成员位置创建该类的对象private static Singleton instance;static {instance new Singleton();}//对外提供静态方法获取该对象public static Singleton getInstance() {return instance;} }说明 该方式在成员位置声明Singleton类型的静态变量而对象的创建是在静态代码块中也是对着类的加载而创建。所以和饿汉式的方式1基本上一样当然该方式也存在内存浪费问题。 3懒汉式-方式1线程不安全 /*** 懒汉式* 线程不安全*/ public class Singleton {//私有构造方法private Singleton() {}//在成员位置创建该类的对象private static Singleton instance;//对外提供静态方法获取该对象public static Singleton getInstance() {if(instance null) {instance new Singleton();}return instance;} }说明 从上面代码我们可以看出该方式在成员位置声明Singleton类型的静态变量并没有进行对象的赋值操作那么什么时候赋值的呢当调用getInstance()方法获取Singleton类的对象的时候才创建Singleton类的对象这样就实现了懒加载的效果。但是如果是多线程环境会出现线程安全问题。 4懒汉式-方式2线程安全 /*** 懒汉式* 线程安全*/ public class Singleton {//私有构造方法private Singleton() {}//在成员位置创建该类的对象private static Singleton instance;//对外提供静态方法获取该对象public static synchronized Singleton getInstance() {if(instance null) {instance new Singleton();}return instance;} }说明 该方式也实现了懒加载效果同时又解决了线程安全问题。但是在getInstance()方法上添加了synchronized关键字导致该方法的执行效率特别低。从上面代码我们可以看出其实就是在初始化instance的时候才会出现线程安全问题一旦初始化完成就不存在了。 5懒汉式-方式3双重检查锁 再来讨论一下懒汉模式中加锁的问题对于 getInstance() 方法来说绝大部分的操作都是读操作读操作是线程安全的所以我们没必让每个线程必须持有锁才能调用该方法我们需要调整加锁的时机。由此也产生了一种新的实现模式双重检查锁模式 /*** 双重检查方式*/ public class Singleton { //私有构造方法private Singleton() {}private static Singleton instance;//对外提供静态方法获取该对象public static Singleton getInstance() {//第一次判断如果instance不为null不进入抢锁阶段直接返回实例if(instance null) {synchronized (Singleton.class) {//抢到锁之后再次判断是否为nullif(instance null) {instance new Singleton();}}}return instance;} }双重检查锁模式是一种非常好的单例实现模式解决了单例、性能、线程安全问题上面的双重检测锁模式看上去完美无缺其实是存在问题在多线程的情况下可能会出现空指针问题出现问题的原因是JVM在实例化对象的时候会进行优化和指令重排序操作。 要解决双重检查锁模式带来空指针异常的问题只需要使用 volatile 关键字, volatile 关键字可以保证可见性和有序性。 /*** 双重检查方式*/ public class Singleton {//私有构造方法private Singleton() {}private static volatile Singleton instance;//对外提供静态方法获取该对象public static Singleton getInstance() {//第一次判断如果instance不为null不进入抢锁阶段直接返回实际if(instance null) {synchronized (Singleton.class) {//抢到锁之后再次判断是否为空if(instance null) {instance new Singleton();}}}return instance;} }小结 添加 volatile 关键字之后的双重检查锁模式是一种比较好的单例实现模式能够保证在多线程的情况下线程安全也不会有性能问题。 6懒汉式-方式4静态内部类方式 静态内部类单例模式中实例由内部类创建由于 JVM 在加载外部类的过程中, 是不会加载静态内部类的, 只有内部类的属性/方法被调用时才会被加载, 并初始化其静态属性。静态属性由于被 static 修饰保证只被实例化一次并且严格保证实例化顺序。 /*** 静态内部类方式*/ public class Singleton {//私有构造方法private Singleton() {}private static class SingletonHolder {private static final Singleton INSTANCE new Singleton();}//对外提供静态方法获取该对象public static Singleton getInstance() {return SingletonHolder.INSTANCE;} }说明 第一次加载Singleton类时不会去初始化INSTANCE只有第一次调用getInstance虚拟机加载SingletonHolder并初始化INSTANCE这样不仅能确保线程安全也能保证 Singleton 类的唯一性。 小结 静态内部类单例模式是一种优秀的单例模式是开源项目中比较常用的一种单例模式。在没有加任何锁的情况下保证了多线程下的安全并且没有任何性能影响和空间的浪费。 7枚举方式 枚举类实现单例模式是极力推荐的单例实现模式因为枚举类型是线程安全的并且只会装载一次设计者充分的利用了枚举的这个特性来实现单例模式枚举的写法非常简单而且枚举类型是所用单例实现中唯一一种不会被破坏的单例实现模式。 /*** 枚举方式*/ public enum Singleton {INSTANCE; }说明 枚举方式属于饿汉式方式。 1.3 存在的问题 1序列化与反序列化破坏单例模式 破坏单例模式 使上面定义的单例类Singleton可以创建多个对象枚举方式除外。有两种方式分别是序列化和反射。 Singleton类 public class Singleton implements Serializable {//私有构造方法private Singleton() {}private static class SingletonHolder {private static final Singleton INSTANCE new Singleton();}//对外提供静态方法获取该对象public static Singleton getInstance() {return SingletonHolder.INSTANCE;} }Test类 public class Test {public static void main(String[] args) throws Exception {//往文件中写对象//writeObject2File();//从文件中读取对象Singleton s1 readObjectFromFile();Singleton s2 readObjectFromFile();//判断两个反序列化后的对象是否是同一个对象System.out.println(s1 s2);}private static Singleton readObjectFromFile() throws Exception {//创建对象输入流对象ObjectInputStream ois new ObjectInputStream(new FileInputStream(C:\\Users\\Think\\Desktop\\a.txt));//第一个读取Singleton对象Singleton instance (Singleton) ois.readObject();return instance;}public static void writeObject2File() throws Exception {//获取Singleton类的对象Singleton instance Singleton.getInstance();//创建对象输出流ObjectOutputStream oos new ObjectOutputStream(new FileOutputStream(C:\\Users\\Think\\Desktop\\a.txt));//将instance对象写出到文件中oos.writeObject(instance);} }上面代码运行结果是false表明序列化和反序列化已经破坏了单例设计模式。 2反射破坏单例模式 Singleton类 public class Singleton {//私有构造方法private Singleton() {}private static volatile Singleton instance;//对外提供静态方法获取该对象public static Singleton getInstance() {if(instance ! null) {return instance;}synchronized (Singleton.class) {if(instance ! null) {return instance;}instance new Singleton();return instance;}} }Test类 public class Test {public static void main(String[] args) throws Exception {//获取Singleton类的字节码对象Class clazz Singleton.class;//获取Singleton类的私有无参构造方法对象Constructor constructor clazz.getDeclaredConstructor();//取消访问检查constructor.setAccessible(true);//创建Singleton类的对象s1Singleton s1 (Singleton) constructor.newInstance();//创建Singleton类的对象s2Singleton s2 (Singleton) constructor.newInstance();//判断通过反射创建的两个Singleton对象是否是同一个对象System.out.println(s1 s2);} }上面代码运行结果是false表明序列化和反序列化已经破坏了单例设计模式 注意枚举方式不会出现这两个问题。 1.4 问题的解决 1序列化与反序列方式破坏单例模式的解决方法 在Singleton类中添加readResolve()方法在反序列化时被反射调用如果定义了这个方法就返回这个方法的值如果没有定义则返回新new出来的对象。 Singleton类 public class Singleton implements Serializable {//私有构造方法private Singleton() {}private static class SingletonHolder {private static final Singleton INSTANCE new Singleton();}//对外提供静态方法获取该对象public static Singleton getInstance() {return SingletonHolder.INSTANCE;}/*** 下面是为了解决序列化反序列化破解单例模式*/private Object readResolve() {return SingletonHolder.INSTANCE;} }源码解析 ObjectInputStream类 public final Object readObject() throws IOException, ClassNotFoundException{...// if nested read, passHandle contains handle of enclosing objectint outerHandle passHandle;try {Object obj readObject0(false);//重点查看readObject0方法..... }private Object readObject0(boolean unshared) throws IOException {...try {switch (tc) {...case TC_OBJECT:return checkResolve(readOrdinaryObject(unshared));//重点查看readOrdinaryObject方法...}} finally {depth--;bin.setBlockDataMode(oldMode);} }private Object readOrdinaryObject(boolean unshared) throws IOException {...//isInstantiable 返回true执行 desc.newInstance()通过反射创建新的单例类obj desc.isInstantiable() ? desc.newInstance() : null; ...// 在Singleton类中添加 readResolve 方法后 desc.hasReadResolveMethod() 方法执行结果为trueif (obj ! null handles.lookupException(passHandle) null desc.hasReadResolveMethod()) {// 通过反射调用 Singleton 类中的 readResolve 方法将返回值赋值给rep变量// 这样多次调用ObjectInputStream类中的readObject方法继而就会调用我们定义的readResolve方法所以返回的是同一个对象。Object rep desc.invokeReadResolve(obj);...}return obj; }2反射方式破解单例模式的解决方法 public class Singleton {//私有构造方法private Singleton() {/*反射破解单例模式需要添加的代码*/if(instance ! null) {throw new RuntimeException();}}private static volatile Singleton instance;//对外提供静态方法获取该对象public static Singleton getInstance() {if(instance ! null) {return instance;}synchronized (Singleton.class) {if(instance ! null) {return instance;}instance new Singleton();return instance;}} }说明: 这种方式比较好理解。当通过反射方式调用构造方法进行创建创建时直接抛异常。不运行此中操作。 1.5 JDK源码解析-Runtime类 Runtime类就是使用的单例设计模式。 1通过源代码查看使用的是哪种单例模式 public class Runtime {private static Runtime currentRuntime new Runtime();/*** Returns the runtime object associated with the current Java application.* Most of the methods of class codeRuntime/code are instance* methods and must be invoked with respect to the current runtime object.** return the codeRuntime/code object associated with the current* Java application.*/public static Runtime getRuntime() {return currentRuntime;}/** Dont let anyone else instantiate this class */private Runtime() {}... }从上面源代码中可以看出Runtime类使用的是饿汉式静态属性方式来实现单例模式的。 2使用Runtime类中的方法 public class RuntimeDemo {public static void main(String[] args) throws IOException {//获取Runtime类对象Runtime runtime Runtime.getRuntime();//返回 Java 虚拟机中的内存总量。System.out.println(runtime.totalMemory());//返回 Java 虚拟机试图使用的最大内存量。System.out.println(runtime.maxMemory());//创建一个新的进程执行指定的字符串命令返回进程对象Process process runtime.exec(ipconfig);//获取命令执行后的结果通过输入流获取InputStream inputStream process.getInputStream();byte[] arr new byte[1024 * 1024* 100];int b inputStream.read(arr);System.out.println(new String(arr,0,b,gbk));} }输出

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

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

相关文章

专业俄文网站建设erp企业管理系统软件开发

本文实例讲述了C语言变量类型与输出控制用法,有助于读者很好的对其进行总结与归纳。该实例分享给大家供大家参考借鉴之用。具体如下:完整实例代码如下:/************************************************《Beginning C 4th Edition》Notes c…

做网站多少分辨率好常用的关键词挖掘工具

随着当前经济的快速发展,社会运行节奏加快,人们更倾向于选择高效的出行方式,而飞机就是其中之一。近年来,全国各地机场的吞吐量不断增长,导致航站楼面积过大,而 GPS全球定位系统在室内感测不到卫星信号无法…

大连网红培训基地南昌优化排名推广

这篇文章建立在我的My Java 9顶级功能文章的基础上,通过对这些功能的深入研究。 在这里,我们向您展示如何在五分钟内学习jshell并改善Java 9开发经验。 入门 假设您已经下载并安装了Java 9,则可以通过键入以下内容启动Shell: js…

网站收录提交工具沧州网站建设的技术方案

一、概述 shell 是一个命令行解释器,它接受应用程序、用户命令,然后调用操作系统内核。 shell 还是一个功能强大编程语言,易调试,易编写,灵活性强。 二、mac 怎么重启docker 1.如何重启 Docker on Mac 在 macOS 上…

成都网站优化报价制作网页的过程

转载于:https://www.cnblogs.com/wuzhiyi/p/10944934.html

网站开发的技术简介是什么织梦做的网站在百度搜索页劫取

来源:http://blog.csdn.net/alex197963/article/details/2219912 在Web应用程序开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话(Session)的一些信息,甚至需要直接对JavaSe…

中国空间站距离地面多少公里免费psd素材网

jQuery File Uploader 是一个 jQuery 文件拖放上传插件,包括 Ajax 上传和进度条效果。作者编写这个插件的想法是要保持它非常简单,不像其他的插件,很多的标记,并提供一些 Hack 的方式使之兼容那些古老的浏览器。jQuery File Uploa…

外贸网站建设书籍营销网站建设培训学校

进销存系统是为了对企业生产经营中进货、出货、批发销售、付款等进行全程进行(从接获订单合同开始,进入物料采购、入库、领用到产品完工入库、交货、回收货款、支付原材料款等)跟踪(每一步都提供详尽准确的数据)、管理…

网站在百度上搜索不到黄骅港赶海时间表

Spring 对 Java 配置的支持是由 Configuration 注解和 Bean 注解来实现的。 有 Bean 注解的 方法将会实例化、配置和初始化一个 新对象&#xff0c;这个对象将由 Spring 的 IoC 容器来管理。Bean 声明所起到的作用与 <bean/> 元素类似。被 Configuration 所注解的类则表…

宽屏网站和普通网站电子商务网站开发报告

随着云计算的普及&#xff0c;腾讯云作为国内领先的云计算服务提供商&#xff0c;为用户提供了丰富的产品和服务。为了帮助用户更好地了解和使用腾讯云&#xff0c;本文将为大家整理汇总2024年3月腾讯云的最新活动及优惠券信息。 1、腾讯云最新活动入口【点此直达】 2、腾讯云…

2013年以前pc网站建设建设教育局网站硬件价格需要多少钱

阻塞和非阻塞&#xff0c;同步和异步是node.js里经常遇到的词汇&#xff0c;举例说明&#xff1a; 我要看足球比赛&#xff0c;但是妈妈叫我烧水&#xff0c;电视机在客厅&#xff0c;烧水要在厨房。家里有2个水壶&#xff0c;一个是普通的水壶&#xff0c;另一个是水开了会叫的…

模板网站的缺陷网站查询入口

选择题 题目&#xff1a; 下面哪些句子可以回答“Thank you.” 题目&#xff1a;单词 bad 和 hat 所包含的元音相同。 题目&#xff1a;单词 bet 和 cat 所包含的元音相同。 题目&#xff1a;单词 snap 和 wet 所包含的元音相同。 题目&#xff1a;单词 mess …

网站建设及维护招聘网站建立不安全怎么取消

分布式搜索引擎01 – elasticsearch基础 0.学习目标 1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 例如&#xff1a; …

外贸展示企业网站网站建设公司itcask

最近做了一个对接华为云视频会议接口&#xff0c;订阅华为云会议事件消息的功能。做之前在网上搜索了一番&#xff0c;居然发现没有一个这方面的资料。决定整理一下分享出来&#xff0c;留给有缘人 具体的需求是&#xff0c;我们的app上集成了华为云会议sdk&#xff0c;在用户开…

新业务在线软件下载湘潭整站优化

如何从Java项目中的相对路径读取文件&#xff1f; java.io.File找不到指定的路径我有一个包含2个包的项目&#xff1a;ListStopWords.txtListStopWords.txt在包(2)中我有一个文本文件ListStopWords.txt&#xff0c;在包(1)中我有一个类FileLoadder.这是代码FileLoader&#xff…

太仓有没有做网站建设的怎么拥有网站的所有权

编号&#xff1a;0266 座位号 2018&#xff5e;2019学年度第一学期期末考试 设计构成试题 2019年1月 一、设计制作题&#xff08;100分&#xff09; 题目&#xff1a;自由形插接构造的留声机博物馆。 要求&#xff1a;以自由形插接构造的方式&#xff0c;设计一个留声机博物馆…

太原网站建设维护网页文件模板下载

【成长点滴】对SMART原则的一些粗浅理解 以下解释来自百度百科 “所谓SMART原则&#xff0c;即是&#xff1a; S&#xff1a;(Specific) 目标要清晰、明确&#xff0c;让考核者与被考核者能够准确的理解目标&#xff1b;M&#xff1a;(Measurable) 目标要量化&#xff0c;考核时…

东莞公司网站做优化app下载安卓软件

目前是使用C嵌入式的python函数 python函数是阻塞式的接收服务器消息 直到退出监听才会有返回值 监听中收到消息会调用python的一个回调函数&#xff0c;可以获取到收到的消息 所以要怎么样来返回消息给C EDIT: 代码如下callback打印可以打印正确数据&#xff0c;问题是 这里用…

昆明网站建设时间云南建设投资集团网站

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 &#x1f4da; 前言 &#x1f4d8; 创建 Pinia &#x1f4d8; Option Store &#x1f4d8; Pinia 提供多种选项配…

成都网站建设网站建设哪家好网页设计图片和文字怎么在一排

来源&#xff1a;机器之心编辑&#xff1a;杜伟、陈萍将芯片的布局规划看作一个深度强化学习问题&#xff0c;谷歌大脑团队希望用 AI 来提升芯片设计效率。基于 AI 的最新设计方案可以在数小时内完成人类设计师耗费数月才能完成的芯片布局&#xff0c;这将有可能引领一场新的芯…