设计模式——单例模式
单例模式分为懒汉式和饿汉式两种
单例模式有 3 个特点:
懒汉式单例模式:
在类加载时便进行单例对象的创建,不会因为线程产生不安全原因
public class Wonder {public static Wonder wonder=new Wonder();private Wonder(){}public static Wonder getWonder(){return wonder;}
}
饿汉式单例模式:
在使用访问方法时才进行单例对象进行生成操作,在多线程的情况下有问题
public class Wonder {public static Wonder wonder;private Wonder(){}public static Wonder getWonder(){if(wonder==null){try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}wonder=new Wonder();}return wonder;}public static void main(String[] args) {for (int i = 0; i < 10; i++) {new Thread(()->{System.out.println(Wonder.getWonder());}).start();}}
}

所以需要处理线程安全问题,可以给访问方法添加锁
public class Wonder {public static Wonder wonder;private Wonder(){}public static synchronized Wonder getWonder(){if(wonder==null){try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}wonder=new Wonder();}return wonder;}public static void main(String[] args) {for (int i = 0; i < 10; i++) {new Thread(()->{System.out.println(Wonder.getWonder());}).start();}}
}

但是虽然给方法加锁以后,线程安全解决了,但是效率下去了 ,所以我们可以给代码块加锁,并使用双重判断,再给单例对象使用volatile关键字,防止指令重排生成半成品对象
//懒汉模式
public class Wonder1 {public static volatile Wonder1 wonder1; //防止指令重排出现半成品对象private Wonder1(){};public static Wonder1 getWonder1(){if(wonder1==null){try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}//防止多个线程进入到此等待锁释放synchronized (Wonder1.class){//当上一层的线程获得锁后再次判断是否已经初始化过if(wonder1==null){wonder1=new Wonder1();}}}return wonder1;}public static void main(String[] args) {for (int i = 0; i < 10; i++) {new Thread(()->{System.out.println(Wonder1.getWonder1());}).start();}}
}

JAVA 中的例子:
相关文章:
设计模式——单例模式
单例模式分为懒汉式和饿汉式两种 在有些系统中,为了节省内存资源、保证数据内容的一致性,对某些类要求只能创建一个实例,这就是所谓的单例模式. 例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理…...
json-server环境搭建及使用
json-server环境搭建 一个在前端本地运行,可以存储json数据的server。 基于node环境,可以指定一个 json 文件作为 API 的数据源。 文章目录json-server环境搭建前提下载安装监听服务启动成功修改端口号方式一:方式二:数据操作测试…...
RabbitMQ运行机制
消息的TTL(Time To Live) 消息的TTL就是消息的存活时间。 • RabbitMQ可以对队列和消息分别设置TTL。 • 对队列设置就是队列没有消费者连着的保留时间,也可以对每一个单独的消息做单独的 设置。超过了这个时间,我们认为这个消息…...
【Spring Cloud Alibaba】(三)OpenFeign扩展点实战 + 源码详解
系列目录 【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战 【Spring Cloud Alibaba】(二)微服务调用组件Feign原理实战 本文目录系列目录前言一、Feign扩展点配置二、OpenFeign扩展点配置1. 通过配置文件配置有效范…...
面向对象设计原则
在面向对象的设计过程中, 我们要对代码进行一个设计, 从而提高一个软件系统的可维护性和可复用性, 那么遵从面向对象的设计原则,可以在进行设计方案时减少错误设计的产生,从不同的角度提升一个软件结构的设计水平。 面向对象有以下七大原则:1.单一职责原…...
2022年“网络安全”赛项湖南省赛选拔赛 任务书
2022年“网络安全”赛项湖南省赛选拔赛 任务书2022年“网络安全”赛项湖南省赛选拔赛 任务书A模块基础设施设置/安全加固(200分)B模块安全事件响应/网络安全数据取证/应用安全(400分)C模块 CTF夺旗-攻击 (200分&#x…...
学习笔记:Java 并发编程⑥_并发工具_JUC
若文章内容或图片失效,请留言反馈。 部分素材来自网络,若不小心影响到您的利益,请联系博主删除。 视频链接:https://www.bilibili.com/video/av81461839配套资料:https://pan.baidu.com/s/1lSDty6-hzCWTXFYuqThRPw&am…...
Linux文件隐藏属性(修改与显示):chattr和lsattr
文件除了基本的九个权限以外还有隐藏属性存在,这些隐藏属性对于系统有很大的帮助,尤其是系统安全(Security)上 chattr(配置文件隐藏属性) chattr 【-】【ASacdistu】文件或目录名称 选项与参数:…...
广东省基层就业补贴
基层就业补贴链接:https://www.gdzwfw.gov.cn/portal/v2/guide/11440309MB2D27065K4440511108001 一.申请条件: 1、劳动者到中小微企业、个体工商户、社会组织等就业,或到乡镇(街道)、村居社会管理和公共服务岗位就业…...
高压放大器在超声导波钢轨传播中的应用
实验名称:高压放大器在超声导波钢轨传播中的应用研究方向:无损检测测试目的:超声导波具有传播距离远、检测距离长的特点,在钢轨无损检测领域受到越来越多的关注。本文使用有限元仿真方法和现场实验方法,对钢轨各模态超…...
Java字符串常见拼接方式
目录 最常见的方式 StringBuilder.append()和StringBuffer.append() String类下的cocat()方法 String类下的join()方法 StringUtils.join 项目中使用 不建议在 for 循环中使用 “” 进行字符串拼接 通过字符串连接,可以将两个或多个字符串、字符、整数和浮点…...
商城业务:购物车
人生在世如身处荆棘之中,心不动,人不妄动,不动则不伤;如心动则人妄动,伤其身痛其骨,于是体会到世间诸般痛苦。 1、购物车需求 1)、需求描述: - 用户可以在登录状态下将商品添加到购…...
计算机网络学习笔记(一)
网络是由若干接点和连接这些结点的链路组成。 多个网络通过路由器互联起来构成覆盖范围更大的互联网。 普通用户通过ISP接入因特网。 基于ISP的三层结构因特网 相隔较远的两台主机间通信可能需要经过多个ISP。 有电路交换,报文交换,分组交换三种交换方…...
【单目标优化算法】烟花优化算法(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
微服务项目【秒杀商品展示及商品秒杀】
登录方式调整 第1步:从zmall-common的pom.xml中移除spring-session-data-redis依赖 注意: 1)本次不采用spring-session方式,改用redis直接存储用户登录信息,主要是为了方便之后的jmeter压测; 2)…...
DIDL3_模型选择、复杂度、过欠拟合的相关概念
模型选择、复杂度、过欠拟合的概念模型选择训练误差和泛化误差验证数据集和测试数据集K-则交叉验证(没有足够多数据时使用)过拟合和欠拟合模型容量模型容量的影响估计模型容量控制模型容量数据复杂度处理过拟合的方法(1)ÿ…...
Android 9.0 去除锁屏界面及SystemUI无sim卡拨打紧急电话控件显示功能实现
1.1概述 在9.0的系统rom定制化开发中,关于SystemUI的定制化功能也是比较多的,在SystemUI的锁屏页面和状态栏提示无sim卡拨打紧急电话控件显示等相关提示 的功能中,在有些systemui的定制中是不需要这些功能的,所以需要从systemui中去掉这些功能提示的,这就需要从systemui中…...
AntDB-M设计之内存结构
亚信科技专注通信行业多年,AntDB数据库从诞生开始,就面对通信级的大数据量应用场景挑战,在性能、稳定性、规模化等方面获得了超过10年的通信核心业务系统验证,性能峰值达到每秒百万的通信核心交易量。AntDB-M(AntDB内存…...
互联网舆情监测公司监测哪些内容,TOOM北京舆情监测公司
互联网舆情监测公司是一种提供舆情监测、分析和管理服务的公司,其业务主要涉及互联网舆情监测、数据分析、报告撰写、危机处理等方面。这些公司通过使用各种技术和工具,帮助客户监测他们在互联网上的声誉和品牌形象,并提供相应的建议和解决方…...
一篇文章带你熟练使用Ansible中的playbook
目录 一、Playbook的功能 二、YAML 1、简介 2、特点 3、语法简介 4、YAML 列表 5、YAML的字典 三、playbook执行命令 四、 Playbook的核心组件 五、vim 设定技巧 练习 一、Playbook的功能 playbook 是由一个或多个play组成的列表 Playboot 文件使用YAML来写的 二、…...
LeetCode1170题解:预处理+二分查找
LeetCode第1170题[比较字符串最小字母出现频次] 典型的先预处理,再二分统计 题目本质: 对于每个 queries[i],计算:有多少个 word 满足 f(queries[i]) < f(word) 也就是:先求出查询串的 f 再去 words 里数有多少个…...
Pixel Mind Decoder 嵌入式应用初探:STM32设备日志情绪分析
Pixel Mind Decoder 嵌入式应用初探:STM32设备日志情绪分析 1. 场景痛点与解决方案 在工业物联网领域,设备维护一直是个让人头疼的问题。想象一下,工厂里几十台STM32设备日夜运转,工程师们每天要盯着密密麻麻的日志数据…...
AI Agent社交网络:为什么这是比AI工具更值得关注的方向?
2026年,AI Agent已经从概念走向落地。从AutoGPT到各类AI助手产品,Agent的能力在不断提升。但有一个问题值得关注:当AI Agent越来越强大,它们之间需要社交吗?今天从行业角度,聊聊AI Agent社交网络这个话题。…...
Yuxi-Know终极部署指南:5步解决大模型RAG知识库常见问题
Yuxi-Know终极部署指南:5步解决大模型RAG知识库常见问题 【免费下载链接】Yuxi-Know 基于大模型 RAG 知识库与知识图谱的问答平台。Llamaindex VueJS Flask Neo4j。大模型适配 OpenAI、国内主流大模型平台的模型调用、本地 vllm 部署。 项目地址: https://gitc…...
C语言弱符号与弱引用技术解析
跨平台C语言开发中的弱符号与弱引用技术解析1. 弱符号技术原理与应用1.1 弱符号定义与语法弱符号是指在定义或声明变量、结构体成员或函数时,通过添加__attribute__((weak))属性标记的对象符号。在C语言中,弱符号的典型定义方式如下:__attrib…...
Comsol中双BIC复现的电磁感应透明现象
comsol 双BIC复现 电磁感应透明在光子晶体波导中实现双连续域束缚态(BIC)总有一种让人又爱又恨的感觉——明明参数稍微跑偏一点就会消失的特性,偏偏在参数调准时又能展现出惊艳的Q值。咱们今天不聊数学推导,直接打开COMSOL手把手…...
AudioSeal Pixel Studio快速部署:Jetson Orin边缘设备上的ARM64适配与性能实测
AudioSeal Pixel Studio快速部署:Jetson Orin边缘设备上的ARM64适配与性能实测 1. 项目背景与核心价值 AudioSeal Pixel Studio是一款基于Meta开源的AudioSeal算法构建的专业音频水印工具。它能够在保持原始音质几乎不变的前提下,为音频文件嵌入隐形数…...
老Mac焕发新生:OpenCore Legacy Patcher完整指南,让旧设备运行最新macOS
老Mac焕发新生:OpenCore Legacy Patcher完整指南,让旧设备运行最新macOS 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 你是否有一台被苹果官方&q…...
数码管驱动原理与工程实现指南
数码管驱动原理与工程实现指南1. 数码管基础认知1.1 数码管分类体系数码管(LED Segment Display)作为经典的显示器件,其分类维度主要包括:字段结构:七段管:包含a-g七个基本段八段管:增加小数点h(DP)段米字管࿱…...
深入C6678启动流程:从BootRom参数表到多核镜像部署的完整解析
深入解析C6678多核启动流程:从BootRom到镜像合成的工程实践 在嵌入式系统开发领域,多核DSP的启动流程设计往往是项目成败的关键环节。TMS320C6678作为TI KeyStone架构的旗舰级八核DSP处理器,其复杂的多级启动机制和灵活的部署方式,…...
