JUC 单例模式样例(极限性能优化)

embedded/2024/9/23 7:48:48/

什么是单例模式

单例模式是一种创建型设计模式,其目的是确保一个类只有一个实例,并提供全局访问点。单例模式通常用于管理全局状态、资源共享或限制资源访问的情况下。


样例代码

这串代码出自《并发编程的艺术》

样例中使用了双重检查锁来实现了单例模式,这串代码相当巧妙,属于极限性能优化的经典样例。

java">public class Singleton { private volatile static Singleton singleton;private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); }  }  }  return singleton;  }  
}

代码解析

这串代码在创建对象时用了两次判空操作,也就是双重检查。

首先设置了一个全局变量singleton

java">private volatile static Singleton singleton;

加volatile的作用是及时知道是否创建对象,防止更多的线程再次进入阻塞队列,在第一次判空时起作用。

随后使构造方法私有

java">private Singleton (){}

目的是为了让外面不能new对象

随后给予创建对象的方法getSingleton(),这个方法和私有的构造方法保证了单例模式的实现。

在方法内先进行了一次判空,如果是空赶紧锁起来并创建一个对象,当不为空时就可以拦截其他所有的线程。

java">if (singleton == null)

随后写了一个同步块,使用 Singleton.class 作为锁对象,在多个线程同时进来的情况下,将第一个锁线程起来,只允许一个线程创建对象。 随后进行了第二次判空,同样是为了保证在多线程的情况下,拦截除第一线程外的所有队列线程

这样避免了多个线程同时通过第一次检查,然后进入同步块,从而提高了性能。

java">if (singleton == null) { singleton = new Singleton(); 
}  

在第二次判空后就可以创建对象了。

最后返回Singleton,即返回 Singleton 的唯一实例。

这串代码是经典的懒汉式单例模式实现,并在此基础上做了性能优化,使用了双重检查锁和 volatile 关键字。代码中在极大的情况下提高了性能,实现了单例模式


http://www.ppmy.cn/embedded/10274.html

相关文章

12.Vue2.x收集表单数据input | v-model | select

文章目录 收集表单数据input | v-model | select 收集表单数据input | v-model | select <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, in…

在线测试与论文管理系统

前端基于easyui bootstrap,后端基于ssmjspmysql (admin/admin) 功能简介: 学生&#xff1a;科目测试,查看测试报告,预选老师,论文上传与下载,修改个人信息. 老师&#xff1a;查看学生成绩,管理学生预选,管理课题,分配课题,批改学生论文,修改个人信息. 管理员&#xff1a;老师…

「PHP系列」PHP Cookie/Session详解

文章目录 一、PHP Cookie1. Cookie的基本概念2. PHP中操作Cookie的常用函数3. Cookie案例代码设置Cookie读取Cookie删除Cookie 4. 注意事项 二、PHP Session1. PHP Session的基本概念2. PHP中操作Session的常用函数3. Session案例代码启动Session并设置数据读取Session数据销毁…

为什么单片机控制电机需要加电机驱动

通常很多地方只是单纯的单片机MCU没有对电机的驱动能力&#xff0c;或者是介绍关于电机驱动的作用&#xff0c;如&#xff1a; 提高电机的效率和精度。驱动器采用先进的电子技术和控制算法&#xff0c;能够精准控制电机的参数和运行状态&#xff0c;提高了电机的效率和精度。拓…

代码随想录算法训练营第三十八天|理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

理论基础 - &#x1f517; 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP。动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点就区分于贪心&#xff0c;贪心没有状态推导&#xff0c;而是从局部直接选最优的。 动态规划五部…

软考高级架构师:AI 通俗讲解单元测试被测模块、桩模块和驱动模块的概念

在软件开发中&#xff0c;单元测试是一种测试方法&#xff0c;用来验证各个独立模块的功能是否正确。为了更好地理解单元测试中的“桩模块&#xff08;Stub Module&#xff09;”、“驱动模块&#xff08;Driver Module&#xff09;”和“被测模块&#xff08;Module Under Tes…

【数据结构(邓俊辉)学习笔记】绪论04——算法分析

文章目录 0. 前言1. 算法分析2.级数2.1基本形式2.2 收敛级数 3.循环 vs 级数4.示例 0. 前言 通过以基本计算模型作为参照&#xff0c;并且以大O记号的形式在上面添加适当刻度&#xff0c;已经建立一套对DSA进行分析的完整工具和体系。不清楚的可以看看复杂度度量 、复杂度分析…

【opencv 加速推理】如何安装 支持cuda的opencv 包 用于截帧加速

要在支持CUDA的系统上安装OpenCV&#xff0c;您可以使用pip来安装支持CUDA的OpenCV版本。OpenCV支持CUDA加速&#xff0c;但需要安装额外的库&#xff0c;如cuDNN和NVIDIA CUDA Toolkit。以下是一般步骤&#xff1a; 安装NVIDIA CUDA Toolkit: 首先&#xff0c;您需要安装NVID…