怎么样建设自己的网站上海科技网站建设

news/2025/9/23 19:36:14/文章来源:
怎么样建设自己的网站,上海科技网站建设,计算机网络网站建设的实训总结,网站建设的ppt从这一讲开始#xff0c;我们将一起探讨设计模式的性能调优。在《Design Patterns: Elements of Reusable Object-Oriented Software》一书中#xff0c;有 23 种设计模式的描述#xff0c;其中#xff0c;单例设计模式是最常用的设计模式之一。无论是在开源框架#xff0…从这一讲开始我们将一起探讨设计模式的性能调优。在《Design Patterns: Elements of Reusable Object-Oriented Software》一书中有 23 种设计模式的描述其中单例设计模式是最常用的设计模式之一。无论是在开源框架还是在我们的日常开发中单例模式几乎无处不在。 1、什么是单例模式 它的核心在于单例模式可以保证一个类仅创建一个实例并提供一个访问它的全局访问点。 该模式有三个基本要点一是这个类只能有一个实例二是它必须自行创建这个实例三是它必须自行向整个系统提供这个实例。 结合这三点我们来实现一个简单的单例 // 饿汉模式 public final class Singleton {private static Singleton instancenew Singleton();// 自行创建实例private Singleton(){}// 构造函数public static Singleton getInstance(){// 通过该函数向整个系统提供实例return instance;} } 由于在一个系统中一个类经常会被使用在不同的地方通过单例模式我们可以避免多次创建多个实例从而节约系统资源。 2、饿汉模式 我们可以发现以上第一种实现单例的代码中使用了 static 修饰了成员变量 instance所以该变量会在类初始化的过程中被收集进类构造器即 方法中。在多线程场景下JVM 会保证只有一个线程能执行该类的 方法其它线程将会被阻塞等待。 等到唯一的一次 方法执行完成其它线程将不会再执行 方法转而执行自己的代码。也就是说static 修饰了成员变量 instance在多线程的情况下能保证只实例化一次。 这种方式实现的单例模式在类加载阶段就已经在堆内存中开辟了一块内存用于存放实例化对象所以也称为饿汉模式。 饿汉模式实现的单例的优点是可以保证多线程情况下实例的唯一性而且 getInstance 直接返回唯一实例性能非常高。 然而在类成员变量比较多或变量比较大的情况下这种模式可能会在没有使用类对象的情况下一直占用堆内存。试想下如果一个第三方开源框架中的类都是基于饿汉模式实现的单例这将会初始化所有单例类无疑是灾难性的。 3、懒汉模式 懒汉模式就是为了避免直接加载类对象时提前创建对象的一种单例设计模式。该模式使用懒加载方式只有当系统使用到类对象时才会将实例加载到堆内存中。通过以下代码我们可以简单地了解下懒加载的实现方式 // 懒汉模式 public final class Singleton {private static Singleton instance null;// 不实例化private Singleton(){}// 构造函数public static Singleton getInstance(){// 通过该函数向整个系统提供实例if(null instance){// 当 instance 为 null 时则实例化对象否则直接返回对象instance new Singleton();// 实例化对象}return instance;// 返回已存在的对象} } 以上代码在单线程下运行是没有问题的但要运行在多线程下就会出现实例化多个类对象的情况。这是怎么回事呢 当线程 A 进入到 if 判断条件后开始实例化对象此时 instance 依然为 null又有线程 B 进入到 if 判断条件中之后也会通过条件判断进入到方法里面创建一个实例对象。 所以我们需要对该方法进行加锁保证多线程情况下仅创建一个实例。这里我们使用 Synchronized 同步锁来修饰 getInstance 方法 // 懒汉模式 synchronized 同步锁 public final class Singleton {private static Singleton instance null;// 不实例化private Singleton(){}// 构造函数public static synchronized Singleton getInstance(){// 加同步锁通过该函数向整个系统提供实例if(null instance){// 当 instance 为 null 时则实例化对象否则直接返回对象instance new Singleton();// 实例化对象}return instance;// 返回已存在的对象} } 但我们前面讲过同步锁会增加锁竞争带来系统性能开销从而导致系统性能下降因此这种方式也会降低单例模式的性能。 还有每次请求获取类对象时都会通过 getInstance() 方法获取除了第一次为 null其它每次请求基本都是不为 null 的。在没有加同步锁之前是因为 if 判断条件为 null 时才导致创建了多个实例。基于以上两点我们可以考虑将同步锁放在 if 条件里面这样就可以减少同步锁资源竞争。 // 懒汉模式 synchronized 同步锁 public final class Singleton {private static Singleton instance null;// 不实例化private Singleton(){}// 构造函数public static Singleton getInstance(){// 加同步锁通过该函数向整个系统提供实例if(null instance){// 当 instance 为 null 时则实例化对象否则直接返回对象synchronized (Singleton.class){instance new Singleton();// 实例化对象} }return instance;// 返回已存在的对象} } 看到这里你是不是觉得这样就可以了呢答案是依然会创建多个实例。这是因为当多个线程进入到 if 判断条件里虽然有同步锁但是进入到判断条件里面的线程依然会依次获取到锁创建对象然后再释放同步锁。所以我们还需要在同步锁里面再加一个判断条件 // 懒汉模式 synchronized 同步锁 double-check public final class Singleton {private static Singleton instance null;// 不实例化private Singleton(){}// 构造函数public static Singleton getInstance(){// 加同步锁通过该函数向整个系统提供实例if(null instance){// 第一次判断当 instance 为 null 时则实例化对象否则直接返回对象synchronized (Singleton.class){// 同步锁if(null instance){// 第二次判断instance new Singleton();// 实例化对象}} }return instance;// 返回已存在的对象} } 以上这种方式通常被称为 Double-Check它可以大大提高支持多线程的懒汉模式的运行性能。那这样做是不是就能保证万无一失了呢还会有什么问题吗 其实这里又跟 Happens-Before 规则和重排序扯上关系了这里我们先来简单了解下 Happens-Before 规则和重排序。 我们在第二期[加餐]中分享过编译器为了尽可能地减少寄存器的读取、存储次数会充分复用寄存器的存储值比如以下代码如果没有进行重排序优化正常的执行顺序是步骤 1\2\3而在编译期间进行了重排序优化之后执行的步骤有可能就变成了步骤 1/3/2这样就能减少一次寄存器的存取次数。 int a 1;// 步骤 1加载 a 变量的内存地址到寄存器中加载 1 到寄存器中CPU 通过 mov 指令把 1 写入到寄存器指定的内存中 int b 2;// 步骤 2 加载 b 变量的内存地址到寄存器中加载 2 到寄存器中CPU 通过 mov 指令把 2 写入到寄存器指定的内存中 a a 1;// 步骤 3 重新加载 a 变量的内存地址到寄存器中加载 1 到寄存器中CPU 通过 mov 指令把 1 写入到寄存器指定的内存中 在 JMM 中重排序是十分重要的一环特别是在并发编程中。如果 JVM 可以对它们进行任意排序以提高程序性能也可能会给并发编程带来一系列的问题。例如我上面讲到的 Double-Check 的单例问题假设类中有其它的属性也需要实例化这个时候除了要实例化单例类本身还需要对其它属性也进行实例化 // 懒汉模式 synchronized 同步锁 double-check public final class Singleton {private static Singleton instance null;// 不实例化public ListString list null;//list 属性private Singleton(){list new ArrayListString();}// 构造函数public static Singleton getInstance(){// 加同步锁通过该函数向整个系统提供实例if(null instance){// 第一次判断当 instance 为 null 时则实例化对象否则直接返回对象synchronized (Singleton.class){// 同步锁if(null instance){// 第二次判断instance new Singleton();// 实例化对象}} }return instance;// 返回已存在的对象} } 在执行 instance new Singleton(); 代码时正常情况下实例过程这样的 给 Singleton 分配内存调用 Singleton 的构造函数来初始化成员变量将 Singleton 对象指向分配的内存空间执行完这步 singleton 就为非 null 了。 如果虚拟机发生了重排序优化这个时候步骤 3 可能发生在步骤 2 之前。如果初始化线程刚好完成步骤 3而步骤 2 没有进行时则刚好有另一个线程到了第一次判断这个时候判断为非 null并返回对象使用这个时候实际没有完成其它属性的构造因此使用这个属性就很可能会导致异常。在这里Synchronized 只能保证可见性、原子性无法保证执行的顺序。 这个时候就体现出 Happens-Before 规则的重要性了。通过字面意思你可能会误以为是前一个操作发生在后一个操作之前。然而真正的意思是前一个操作的结果可以被后续的操作获取。这条规则规范了编译器对程序的重排序优化。 我们知道 volatile 关键字可以保证线程间变量的可见性简单地说就是当线程 A 对变量 X 进行修改后在线程 A 后面执行的其它线程就能看到变量 X 的变动。除此之外volatile 在 JDK1.5 之后还有一个作用就是阻止局部重排序的发生也就是说volatile 变量的操作指令都不会被重排序。所以使用 volatile 修饰 instance 之后Double-Check 懒汉单例模式就万无一失了。 // 懒汉模式 synchronized 同步锁 double-check public final class Singleton {private volatile static Singleton instance null;// 不实例化public ListString list null;//list 属性private Singleton(){list new ArrayListString();}// 构造函数public static Singleton getInstance(){// 加同步锁通过该函数向整个系统提供实例if(null instance){// 第一次判断当 instance 为 null 时则实例化对象否则直接返回对象synchronized (Singleton.class){// 同步锁if(null instance){// 第二次判断instance new Singleton();// 实例化对象}} }return instance;// 返回已存在的对象} } 4、通过内部类实现 以上这种同步锁 Double-Check 的实现方式相对来说复杂且加了同步锁那有没有稍微简单一点儿的可以实现线程安全的懒加载方式呢 我们知道在饿汉模式中我们使用了 static 修饰了成员变量 instance所以该变量会在类初始化的过程中被收集进类构造器即 方法中。在多线程场景下JVM 会保证只有一个线程能执行该类的 方法其它线程将会被阻塞等待。这种方式可以保证内存的可见性、顺序性以及原子性。 如果我们在 Singleton 类中创建一个内部类来实现成员变量的初始化则可以避免多线程下重复创建对象的情况发生。这种方式只有在第一次调用 getInstance() 方法时才会加载 InnerSingleton 类而只有在加载 InnerSingleton 类之后才会实例化创建对象。具体实现如下 // 懒汉模式 内部类实现 public final class Singleton {public ListString list null;// list 属性private Singleton() {// 构造函数list new ArrayListString();}// 内部类实现public static class InnerSingleton {private static Singleton instancenew Singleton();// 自行创建实例}public static Singleton getInstance() {return InnerSingleton.instance;// 返回内部类中的静态变量} } 5、总结 单例的实现方式其实有很多但总结起来就两种饿汉模式和懒汉模式我们可以根据自己的需求来做选择。 如果我们在程序启动后一定会加载到类那么用饿汉模式实现的单例简单又实用如果我们是写一些工具类则优先考虑使用懒汉模式因为很多项目可能会引用到 jar 包但未必会使用到这个工具类懒汉模式实现的单例可以避免提前被加载到内存中占用系统资源。 6、思考题 除了以上那些实现单例的方式你还知道其它实现方式吗

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

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

相关文章

毕业设计h5网站制作贵阳好的网站建设公司

import React, { Component } from react;class List extends Component {constructor(props) {super(props);}render() {return <div>1111</div>;} }export default List;

网站流量查询网站统计查询网站建设需要写语句吗

PEP 8是最古老的PEP之一&#xff0c;它向Python程序员提供了代码格式设置指南。PEP 8的篇幅很长&#xff0c;但大都与复杂的编码结构相关。 https://python.org/dev/peps/pep-0008/转载于:https://www.cnblogs.com/botoo/p/7830980.html

教做甜点的网站换友情链接的网站

朴素的 f[S]表示S到(1<<n)的期望次数 发现1的个数只增加不减少 所以可以类似拓扑序的图&#xff0c;然后枚举子集O(3^n)转移 没有优化的余地 另辟蹊径&#xff1a; 拆开每一位来看 t[i]表示第i位变成1的次数 ansE(max(t[i])) 根据min-max容斥 得到&#xff1a;ans∑E(t[i…

海口智能建站价格国外服务器租用价格

Description 给你一个字符串str&#xff0c;字符串中的字母都已按照升序排序&#xff0c;且只包含小写字母。另外给出一个目标字母target&#xff0c;请你寻找在这一有序字符串里比目标字母大的最小字母。 在比较时&#xff0c;字母是依序循环出现的。例如&#xff0c;str“ab…

福田专门做网站推广公司做网站怎么回本

41、计算机操作的最小时间单位是__________。A A. 时钟周期 B. 指令周期 C. CPU周期 D. 外围设备 42、微程序控制器中&#xff0c;机器指令与微指令的关系是__________。B A. 每一条机器指令由一条微指令来执行 B. 每一条机器指令由一段用微指令编成…

Win10服务器远程连接断开后.bat脚本进程中断的全面解决高效的方案

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

NRF54L15 两者结合的jlink保护机制(硬件+软件)

默认更安全:只有当硬件和软件两层都“解锁”时,调试端口才开放。 典型流程: 上电/复位时,硬件先根据 UICR.APPROTECT 决定是否允许软件控制。 如果硬件允许,固件可通过写 APPROTECT.DISABLE 临时解锁调试端口(直…

软件测试员的核心技能:一文掌握等价类划分与边界值分析

等价类划分和边界值分析,看似简单,却是测试工程师安身立命的根本。它们体现了测试工作的精髓:在混沌中建立秩序,在无限中寻找有限,在风险最高的地方投入精力。引言:我们不是在“挑刺”,而是在“守护” 作为一名…

最精品网站建设如何将自己做的网站放到网上

ChatGPT插件平台有望成为影响深远的"下一件大事"&#xff0c;因此对于开发者来说&#xff0c;有必要对ChatGPT插件的开发有一定的了解。原文: Writing a ChatGPT Plugin With Go[1] 我工作的附带福利之一是偶尔可以接触试用一些很酷的新技术&#xff0c;最近的一项技…

《CBI 技术有聊》对话 OpenCSG:智能体落地困境与企业转型的必然路径

智能体热潮下的冷思考 2025 年,“智能体(Agent)”无疑是 AI 行业的焦点。它被称为继“大模型”之后的第二次浪潮,资本热情与行业跟风让它迅速升温。然而,在热潮背后,企业的现实却并不乐观:算力闲置、数据不足、…

汕头个人网站推广建设提升审美网站

为什么80%的码农都做不了架构师&#xff1f;>>> 1.面试题 例如&#xff1a; ip计算后的值&#xff1d;53文本内容&#xff1a;1,100,北京 101,1000,上海 1001,3001,广州 ...求ip53对应的省份2.代码如下&#xff1a; #!/usr/bin/python # coding: utf8def ip_find(i…

58和搜房那个网站做房产好wordpress主题插件下载

你拿起一个计算器&#xff0c;输入“26”&#xff0c;计算器会输出“8”&#xff1b;过了一会儿&#xff0c;你又在这个计算器上输入“26”&#xff0c;它依然会输出“8”。这种靠谱的计算器——对于同一个输入&#xff0c;它始终还给我们同一个输出——我们称之为线性计算器或…

直播网站开发报价wordpress 屏蔽

在企业内网开发环境方面&#xff0c;文件服务器是一个非常重要的环节。在这当中&#xff0c;Samba服务器由于其权限控制的高度灵活性&#xff0c;在这里抚琴煮酒会进行一些列详细的说明。之前我们已经介绍了Samba服务器一些入门和基本的更换用户、端口监听、列表控制等技巧&…

h5电子商城网站开发wordpress ajax分页插件

简介&#xff1a; 上文说到云计算的十余年发展让整个互联网行业发生了翻天覆地的变化&#xff0c;Serverless 作为云计算的产物&#xff0c;或者说是云计算在某个时代的表现&#xff0c;被很多人认为是真正意义上的云计算&#xff0c;关于“Serverless 是什么”这个问题&#x…

Mac怎么搭建网站开发环境怎么做网站二维码

用户与角色之间的关系 我们在做用户模块的时候&#xff0c;漏掉了最后一个功能。在新增功能中是可以选择角色的。 用户与角色之间的关系也是多对多 一个用户对应多个角色一个角色可以被多个用户使用。现在呢&#xff0c;我们的用户表已经是写的了。我们最好就不要修改原有的用户…

微信官方网站公众平台什么叫网站降权

一、搭建开发环境 搭建环境可以从这里开始&#xff1a; 微信小程序从零开始开发步骤&#xff08;一&#xff09;搭建开发环境 - 简书 二、程序示例 1、AppleMusic https://download.csdn.net/download/m0_54925305/89977187 2、仿B站首页 https://download.csdn.net/downlo…

太原网站开发团队公司申请邮箱怎么申请

Problem Description 键盘输入一个高精度的正整数n&#xff08;≤100位&#xff09;&#xff0c;去掉其中任意s个数字后剩下的数字按照原来的左右次序组成一个新的正整数。编程对给定的n与s&#xff0c;寻找一种方案&#xff0c;使得剩下的数字组成的新数最小。Input 输入有多组…

怀化市建设局门户网站保定有哪些做网站的地方

springboot配置swagger Swagger 是什么Swagger配置springboot代码展示总结 Swagger 是什么 Swagger 是一个用于构建、文档和调用 RESTful Web 服务的强大工具。它提供了以下几方面的好处&#xff1a; 自动生成 API 文档: Swagger 可以自动生成 API 文档&#xff0c;包括接口的…

北京网站定制流程网页版微信登录入口官网

AI 对话【人工智能】 前言版权开源推荐AI 对话v0版本&#xff1a;基础v1版本&#xff1a;对话数据表tag.jsTagController v2版本&#xff1a;回复中textarea.jsChatController v3版本&#xff1a;流式输出chatLast.jsChatController v4版本&#xff1a;多轮对话QianfanUtilChat…

个人对软件工程的理解

我认为,软件工程的概念可以拆分为以下六个方面: 1. 系统化开发 系统化开发强调在软件开发过程中采用科学的方法和结构化流程,而不是随意编写代码。它要求开发团队按照从需求分析到设计、实现、测试、部署和维护的完…