单例模式

Unity框架学习【单例模式基类】{个人单例模式总结,框架单例模式总结} 这三天花了点时间,学习了B站唐老师的框架,里面有很多知识都有很强的复用性。 即,完成一次之后的很多工作都可以节省,而且优化整个程序的结构。 首先就是唐老师的课程都是递进式的,也就是前面的课程会很大程度的影响到后面的课程,而单例模式,是我目前使用最多的模式【要加紧学习新的设计模式】,例如在我的一本介绍《游戏设计模式》课本里面就有明确的写到。 “唯独单例模式,我们是要考虑怎么尽可能少的去使用他” 然后... 阅读详情

http://jameswxx.iteye.com/blog/1054992

单例模式?多么简单!也许吧,可是要通过简单的现象,看到问题的本质,就比较难,知其然而不知其所以然,这种态度不好。

 

一:看看最简单的

Java代码   收藏代码
  1. <span style="font-size: small;">public class SingleInstance{  
  2.   private static  instance=new SinleInstance();  
  3.   
  4.   public static SingleInstance getInstance(){  
  5.    return instance;  
  6.   }  
  7. }</span>  

 

这个很明了,也确实会返回唯一的实例,但是如果我永远都不会用到SingleInstance.getInstance(),instance这个对象却一直存在,占用了内存空间,浪费。

 

二:那就不先实例化

Java代码   收藏代码
  1. public class SingleInstance{  
  2.   private static  SingleInstance instance;  
  3.   
  4.   public static  SingleInstance getInstance(){  
  5.    if(instance==null){  
  6.       instance=new SingleInstance();  
  7.    }  
  8.    return instance;  
  9.   }  
  10. }  

表面上,这个似乎是可行的。但是很显然,在多线程并发环境中,可能会创建两个instance,也有可能一个线程拿到的instance是一个不完整的实例。

 

三:好吧,那我加上同步总可以吧

Java代码   收藏代码
  1. public class SingleInstance{  
  2.   private static  SingleInstance instance;  
  3.   
  4.   public static synchronized SingleInstance getInstance(){  
  5.    if(instance==null){  
  6.       instance=new SingleInstance();  
  7.    }  
  8.    return instance;  
  9.   }  
  10. }  

这个虽然不会有内存上的浪费,但是有同步锁住了整个class,会降低系统的性能。按照数据结构的说法,就是一个提高了空间复杂度,一个提高了时间复杂度。

 

四:最佳实践

比较好的做法  

Java代码   收藏代码
  1. public class SingleInstance {  
  2.     private static class InstanceHolder {  
  3.         public static final SingleInstance instance = new SingleInstance();  
  4.     }  
  5.   
  6.     public static SingleInstance getInstance() {  
  7.         return InstanceHolder.instance;  
  8.     }  
  9. }  

这种Holder做法保证了实例在用到的时候才会创建,而且创建的实例肯定是唯一的。


五:所谓的DCL 
下面这种做法是广为流传的所谓DCL(双重检查锁定)做法,这是没有正确理解java内存模型造成的,只保证了创建实例的原子性,而没有解决共享资源的可见性。

Java代码   收藏代码
  1. <pre class="java" name="code"><span style="font-size: small;">public class SingleInstance{  
  2.   private static  SingleInstance instance;  
  3.   
  4.   public static  SingleInstance getInstance(){  
  5.    if(instance==null){  
  6.        synchronized(SingleInstance.class){  
  7.            if(instance==null){  
  8.                instance=new SingleInstance();  
  9.            }  
  10.        }  
  11.    }  
  12.    return instance;  
  13.   }  
  14. }  
  15. </span>  
  16.   
  17.   
  18.   
  19. </pre>  

表面上看,这个似乎确实没有什么问题呢,其实还是有问题的,虽然概率比较小,要深刻的理解为什么,必须要对java内存模型比较熟悉。对于instance的创建,某个时刻某个线程拿到了同步锁,将instance创建了,并且及时写回了主存。但是对于另一个线程而言,它不能及时“看到”instance变量的最新值。它的instance可能是工作内存里的而不是主内存里的,甚至更为糟糕的情况是,instance是主内存的,可它的某些属性是工作内存的,这会导致程序发生莫名其妙不可捉摸的错误。在平台级框架里,这会造成系统在高并发环境下不稳定,甚至造成致命的错误 。

innovus:InstPad、CellPad 、module padding、clock cell halo 我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?site_num指的是padding的大小以site宽度为单位。 阅读详情

相关推荐

vivado下ECO操作-不重新综合实现修改属性并生成.bit

ECO即engineer change order,即工程变更指令,可以对设计做局部小改动并只对改动部分重新布局布线并生成.bit。在一个工程动辄编译几个小时情况下,可以在调试中节省大量时间。比如我们在调试中,需要改变时钟占空比或者相位,需要改变寄存器初值等等,此时用ECO暂时改动,待验证后在重新编译无疑是最有效率的方法。 实现ECO通常有两种方式,一是通过vivado界面完成,另一种方法就是tcl脚本。所有的ECO操作都可以通过tcl操作完成,有的操作用vivado界面无法完成,只能通过tcl。以下主要

4657

Java多线程基础-8:单例模式及其线程安全问题

单例指的就是单个实例(instance),也就是单个对象(对象就是类的实例)。单例模式指的是某个类在进程中只有唯一一个实例(在一个程序中,只能创建一个实例(一个对象),不能创建多个对象)。按理来说,在写代码的时候多 new 几次,就能创建多个对象了。但在语法上,是有办法禁止这样多 new 几次的操作的。也就是说,Java中的单例模式,实际上是借助 Java 语法,保证某个类只能够创建出一个实例,而不能被new多次。为什么会有这样的用途?其实原因是很简单的:在有些场景下,本身它就要求某个概念是单例的。

wyd_333的博客 3315

从问卷到结论:手把手教你用SPSS 28完成一份完整的社科数据分析报告

本文详细介绍了如何使用SPSS 28完成社会科学研究中的数据分析报告,从问卷数据导入、清洗到描述性和推断性统计分析,再到结果呈现与报告撰写。通过实际案例演示,帮助研究者掌握SPSS 28的核心功能,提升数据分析效率与报告质量。

weixin_28717431的博客 249

线程安全之单例模式

这篇文章,我们会介绍一下单例模式,但这里的单例模式,不是我们所说的设计模式,当然听到设计模式,大家一定都说,我当然知道设计模式了,有23种呢?一下子一顿输出,当然我这里说的单例模式还是跟设计模式有一些区别的,当然我不做概述,因为我也没咋个去了解过设计模式,我把大家拉回来,什么是多线程对的单例模式呢?看完我以下的解释相信你会明白的.多线程环境下的单例模式需要保证只有一个实例对象被创建,并且可以在多线程环境下安全地访问该实例。

m0_61869253的博客 1690

数据库1:数据库创建与管理(头歌云课)

在 Windows 系统中,可以直接通过 SQLServer 的应用程序连接数据库,不过很多时候在生产环境下,我们需要通过命令行来连接数据库。两个数据库,数据库名分别为 TestDb 和 MyDb 的数据库,注意先后顺序。为了完成本关任务,你需要掌握:1.如何在 Linux 系统中连接 SQLServer 数据库,2.如何创建数据库。连接的数据库是本地数据库,用户名是 sa ,密码是 '

weixin_60530224的博客 2315

JDK8升级JDK17过程中遇到的那些坑

JDK8虽然非常好,但是JDK版本已经发布到JDK20了,且JDK8后的版本升级了很多新的特性,如模块化、ZGC以及虚拟线程、结构性并发等,也是非常有吸引力的,所以决定将基于JDK8的项目升级到最近的LTS版本JDK17。

BASK2312的博客 6685

Java中单例模式的线程安全性

Java中单例模式的线程安全性

QYgujingjing的专栏 1211

深度解析 Android 开发工程师岗位:技术栈、职责与面试全攻略

本文深度剖析Android开发工程师职位要求,从核心技术栈到面试准备进行全面解读。关键点包括:1)掌握Kotlin语言特性和Jetpack组件;2)具备UI开发、性能优化和逆向分析能力;3)理解MVVM架构和Room数据库;4)熟悉常用工具链和开发流程。文章提供了详细的面试题库及解析,涵盖基础概念、UI优化、架构设计等方向,并给出职业发展建议:夯实基础、拓展技术广度、培养工程素养。旨在帮助开发者系统性地准备Android岗位求职,把握移动开发领域的技术趋势。

郑伟强dev的专栏 173

单例模式大杂烩

以下哪种方式实现的单例是线程安全的:(A B C D) A、枚举 B、静态内部类 C、双检锁模式 D、饿汉式 1、单例模式的定义 定义:确保一个类只有一个实例,并提供该实例的全局访问点。 这样做的好处是:有些时候,只需要一个实例就够了,使用单例模式就可以避免创建多个实例;同时,频繁的创建与销毁,会耗费系统资源。 2、单例模式的设计要素 一个私有构造函数 (确保只能单例类自己创建实例) 一个私有静态变量 (确保只有一个实例) 一个公有静态函数 (给使用者提供调用方法) 简单来说就是,单例类的

qq_35091353的博客 360

RT-DETR改进策略【独家融合改进】| SPD-Conv+PPA 再次提升模型针对小目标的特征提取能力

SPD-Conv是一种新的 CNN 构建模块,用于替代传统 CNN 架构中使用的步长卷积(strided convolution)和池化(pooling)层,它由空间到深度(Space-to-depth,SPD)层和非步长卷积(non - strided convolution)层组成。

Limiiiing的博客 1154

5分钟快速上手:用AI生成3D虚拟场景的保姆级教程

你是否想过:不用学复杂的3D建模软件,不用懂“多边形”“UV贴图”这些专业术语,也能快速生成一个梦幻的森林、未来感的城市,甚至外太空基地?本文的目的就是教完全没接触过3D技术的新手,用AI工具5分钟生成3D虚拟场景。我们会覆盖主流AI工具的选择、提示词编写技巧、生成后的简单调整,以及常见问题解决。本文会像“游戏任务指南”一样,从“认识工具”→“写提示词”→“生成场景”→“调整优化”逐步讲解,最后还会教你把生成的3D场景用起来!提示词:你给AI的“订单备注”,越详细效果越好。扩散模型。

AI 原生应用开发的博客 1962

Java单例模式:掌握创建线程安全的高效单例实例的五种方法

单例模式是一种常用的软件设计模式,它的核心目标是确保一个类只有一个实例,并提供该实例的全局访问点。

超级博客 1343

YOLOv8改进 | 注意力机制 | 添加HAttention(HAT)超分辨率重建助力小目标检测 (全网首发,超分辨率检测)

本文给大家带来的改进机制是HAttention注意力机制,混合注意力变换器(HAT)的设计理念是通过融合通道注意力和自注意力机制来提升单图像超分辨率重建的性能。通道注意力关注于识别哪些通道更重要,而自注意力则关注于图像内部各个位置之间的关系。HAT利用这两种注意力机制,有效地整合了全局的像素信息,从而提供更为精确的结果(这个注意力机制挺复杂的光代码就700+行),但是效果挺好的也是10月份最新的成果非常适合添加到大家自己的论文中。⭐⭐⭐⭐⭐(最新的改进机制)

Snu77的博客 1万+

单例模式的实现

当在应用程序中需要控制资源共享、进行配置管理和日志记录等操作时,一种常见的需求是希望通过一个全局访问点,让程序无论在哪个地方,只要能够访问到,就可以通过这个全局访问点,来获取相关实例信息。对于懒汉式单例模式,单例实例在第一次被使用时构建,延迟初始化,相对资源利用率高。如果学过Spring的小伙伴,应该清楚,Spring框架中,默认情况下管理的Bean是单例的,这也意味着Spring容器在创建和管理Bean时,每个Bean只会有一个实例,并且这个实例会被所有需要它的地方共享。:避免重复创建实例,节省资源。

Hardy Army的博客 1613

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++单例模式详解

C++ 单例模式详解,懒汉式单例,饿汉式单例

Marvek的博客 5328

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

什么是单例模式?单例模式详解

个人印象笔记地址:https://app.yinxiang.com/fx/eaa22560-57a4-4554-8de8-b5f254090d37 单例模式介绍 1.1 模式说明 实现1个类只有1个实例化对象 & 提供一个全局访问点 1.2 作用(解决的问题) 保证1个类只有1个对象,降低对象之间的耦合度 1.3 工作原理 在Java中,我们通过使用对象(类实例化后)来操作这些类,类实例化是通过它的构造方法进行的,要是想实现一个类只有一个实例化对象,就要对类的构造方法做改变。 单

weixin_43373417的博客 2125

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

单例模式笔记

单例模式 简述: 单例模式是一种常用的软件设计模式。这种模式属于创建型模式,在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例,该模式的类提供了一种访问其唯一的对象的方式。 饿汉式单例模式 简述:在类加载之前唯一实例对象已经创建完成 实现类: package com.wu.Singleton; public class SingletonDemo { private String name; private int age ; //

一夜星尘 9383

单例模式《单例模式概念、什么时候能用到单例模式、单例模式的好处》

坚持原创输出,点击蓝字关注我吧作者:清菡博客:oschina、云+社区、知乎等各大平台都有。目录一、单例模式的概念1.类每次实例化的时候都会创建一个新的对象,如果要求类只能被实例化一次该怎...

清菡的博客 1480

单例模式以及反射对单例模式的破坏及防御

单例模式是 Java 中非常重要的设计模式,它确保了类只有一个实例,但由于 Java 的反射机制,饿汉式、懒汉式、双重校验锁和静态内部类实现的单例模式都可以被反射轻松破坏。通过在构造方法中添加实例校验机制,我们可以有效防止反射创建多个实例。饿汉式:即使不使用,也会提前加载单例,浪费内存。懒汉式:通过实现线程安全的懒加载,但并发性能较低。双重校验锁:提高了并发性能,使用volatile防止指令重排问题。静态内部类:相较于双重校验锁更加优雅,实现了懒加载和线程安全。

weixin_54574094的博客 1904

单例模式及破解单例模式

单例模式:一个类自己负责创建自己的对象,同时确保系统中该对象只会被创建一个! 特点: 在整个系统中只能有一个该类的实例(必须确保构造器私有,避免其他类new出该类的对象) 他必须自行创建这个实例(在代码对应的类中自己编写实例化逻辑) 它必须自行向整个系统提供这个实例(对外提供实例化方法,外面的类想要这个实例的对象随时可以调用) 单例模式的饿汉式 public class Person { private String name; private String age; //

weixin_49149614的博客 679

java单例模式、Scala单例模式

单例java的两种单例模式Scala的单例模式 java的两种单例模式 /** * 单例 * * 一个类只能创建一个对象, * 定义的步骤: * 恶汉式: * 1、私有构造器 * 2、提供一个public的static的返回值为本类引用的方法 * 3、为了给第2步中提供实例,创建一个private的s...

Baiyabai的博客 1236

小谈单例模式 | 单例模式的八种写法?

看了这篇文章,你能和面试官畅谈单例模式一、前言二、单例模式最通俗的解释来一个简单的例子三、实现单例模式的8种写法1.饿汉式(静态常量)(可用)2.饿汉式(静态代码块)(可用)3.懒汉式(线程不安全)(不可用)4.懒汉式(线程安全)(不推荐)5.懒汉式(线程不安全)(不可用)6.懒汉式(双重检查)(推荐面试使用)7.懒汉(静态内部类方式)(可用)8.枚举 推荐在项目中使用四、常见面试问题五、关于几种...

qq_35764460的博客 1690

什么是单例模式

单例模式: 1.保证类在内存中只能有一个对象 单例模式分为: 1.懒汉式:类一加载就创建对象 2.饿汉式:用的时候,才去创建对象 相关经验: 饿汉式 (是不会出现问题的单例模式) 懒汉式 (可能会出现问题的单例模式) (1.)懒加载(延迟加载) (2.)线程安全问题 1.)是否多线程环境 是 2.)是否有共享数据 是 3.)是否有多条语句操作共享数据 是 举例: 1.饿汉模...

Good_Luck_Li的博客 7758

单例模式的应用

单例模式定义: 单例模式(Singlleton Pattern) 是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。 一、饿汉式 优点:执行效率高,性能高,没有任何的锁 缺点:某些情况下,可能会造成内存浪费 二、懒汉式 优点:节省了内存 缺点:线程不安全的问题 三、线程式 四、 ...

qq_43170213的博客 1981

单例模式及单例模式的应用

单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。 ...

xpdbaba的博客 576
上一篇: Servlet线程安全性问题
下一篇: java socket编程
优雅的程序员
博客等级 码龄15年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值