深入分析线程安全问题的本质
深入分析线程安全问题的本质
- 1. 并发编程背后的性能博弈
- 2. 什么是线程安全问题?
- 3. 源头之一:原子性问题
- 3.1. 原子性问题示例
- 3.2. 原子性问题分析
- 3.3. 如何解决原子性问题?
- 4. 源头之二:可见性问题
- 4.1. 为什么会有可见性问题?
- 4.2. 可见性问题示例
- 5. 源头之三:重排序问题
- 5.1. 重排序问题示例
- 6. 总结
1. 并发编程背后的性能博弈
随着科技的进步,CPU、内存和I/O设备的性能不断提升,但它们之间的速度差异仍是计算机设计的核心问题。
简单来说,CPU在运算时,必须从内存中读取数据和指令,而CPU的计算速度远高于内存的I/O速度,导致了性能瓶颈。
根据木桶理论,程序的整体性能受最慢操作的限制。大多数程序都频繁访问内存或进行I/O操作,因此单纯提升CPU性能并不足以突破瓶颈。
为了缓解这一问题,计算机架构、操作系统和编译器都作出优化:
- 缓存机制:CPU通过引入L1、L2、L3缓存来弥补与内存的速度差异。
- 进程与线程管理:操作系统采用进程和线程分时复用机制,平衡CPU与I/O速度差异。
- 编译器优化:优化指令执行顺序,提高缓存利用率,减少CPU等待内存的时间。
然而,这些优化在提升系统性能的同时,也为并发编程带来了新的挑战,尤其是线程安全问题。
2. 什么是线程安全问题?
线程安全问题指的是当多个线程同时访问共享资源时,程序无法按预期正常执行,导致数据不一致。
导致线程不安全的原因主要有三个:
- 原子性问题:多个线程同时访问共享变量时,可能会中断或交叉执行,导致不正确的结果。
- 可见性问题:一个线程对共享变量的修改,其他线程可能看不到,造成数据不一致。
- 重排序问题:由于编译器、JVM或处理器优化,导致代码执行顺序不一致,产生错误的结果。
下面我们具体分析下。
3. 源头之一:原子性问题
什么是原子性呢?
- 在数据库事务的ACID特性中就有原子性,它意味着一个操作要么完全成功,要么完全失败,不允许部分成功或部分失败。
- 在多线程编程中,原子性指的是一个操作(或一组操作)在执行过程中不能被中断,保证要么全部完成,要么全部不做。
下面我们来演示一个多线程中出现原子性问题的例子。
3.1. 原子性问题示例
public class MultiThreadsError implements Runnable {static MultiThreadsError instance = new MultiThreadsError();int index = 0;public static void main(String[] args) throws InterruptedException {Thread thread1 = new Thread(instance);Thread thread2 = new Thread(instance);thread1.start();thread2.start();thread1.join();thread2.join();System.out.println("结果是" + instance.index); //小于20000,每次结果不一样}@Overridepublic void run() {for (int i = 0; i < 10000; i++) {index++;}}
}
打印结果:
结果是11028
原因分析:
index++
不是原子操作:index++
实际上包括三个步骤:- 读取 index 的值。
- 将值加 1。
- 将新的值写回 index。
- 多线程相互干扰:线程1和线程2可能同时读取相同的 index 值,然后各自加 1 并写回,导致加 1 操作互相覆盖,最终结果不正确。
3.2. 原子性问题分析
从本质上说,原子性问题产生的原因有两个:
- CPU时间片切换;
- 非原子性指令:例如,index++ 不是一个原子操作,它包含多个步骤(读取、加1、写回)。
CPU时间片切换
现代操作系统通过时间片轮转调度线程,每个线程在CPU上运行一段时间后会被切换。
这种切换可能导致线程在操作共享数据时产生原子性问题。例如,线程A读取某个变量的值,然后准备修改它,但在修改之前,线程A被切换出去,线程B也修改了这个值。结果,线程A的操作就丢失了,导致数据不一致。
除此之外,在多核CPU中,线程的并行执行也会导致原子性问题。
如图所示,两个线程并行执行,同时从内存中将 index 加载到寄存器中并进行计算,最终导致 index 的结果小于我们的预期值。
3.3. 如何解决原子性问题?
通过上述分析,我们发现多线程环境下的并行执行或线程切换,可能导致结果不符合预期。为了解决这一问题,主要有两个方法:
- 避免指令中断:确保
index++
等非原子操作在执行过程中不被中断,避免上下文切换。 - 使用互斥机制:通过同步控制,确保多线程执行时,只有一个线程能操作共享资源,从而避免并发冲突。
在Java中,可以使用 synchronized
关键字来实现这一功能,确保同一时刻只有一个线程可以访问共享资源。
@Override
public synchronized void run() {for (int i = 0; i < 10000; i++) {index++;}
}
4. 源头之二:可见性问题
可见性问题是指一个线程对共享变量的修改,另一个线程可能看不到,从而导致数据不一致。
4.1. 为什么会有可见性问题?
现代CPU设计中有三级缓存(L1、L2、L3缓存),这些缓存的目的是加速CPU与内存之间的数据传输,减少CPU访问内存的延迟。
如下图所示,L1和L2缓存是每个CPU核心的私有缓存,L3缓存是多个核心共享的缓存。
不同线程可能运行在不同的CPU核心上,每个核心有自己的缓存(L1、L2)。当一个线程修改数据时,工作内存中的数据不会立即同步到主内存,这可能导致缓存不一致。
比如下图中:
- 两个CPU的缓存中都缓存了x=20这个值;
- 其中CPU2将x=20修改成了x=40,这个修改只对本地缓存可见,
- 而当CPU1后续对x再进行运算时,它获取的值仍然是20,这就是缓存不一致的问题。
这种缓存不一致是可见性问题的主要原因。
4.2. 可见性问题示例
接下来以一个例子来证实内存的不可见。
public class Visibility {boolean flag = true;public void changeFalse() {this.flag = false;}public static void main(String[] args) throws InterruptedException {Visibility visibility = new Visibility();new Thread(() -> {System.out.println("5s后flag修改为flase");try {Thread.sleep(5);} catch (Exception e) {e.printStackTrace();}visibility.changeFalse();System.out.println("ChangeFalse线程修改flag的值为: " + visibility.flag);}, "ChangeFalse").start();while (visibility.flag == true) {}System.out.println("主线程得到flag的值为false");}
}
代码分析:
- flag:一个普通的实例变量,初始化为 true。
- 子线程(ChangeFalse)在 5 秒后将 flag 修改为 false,然后打印修改后的值。
- 主线程通过
while (visibility.flag == true)
不断检查 flag,等待它变为 false,并打印 “主线程得到flag的值为false
”。
点击执行:
5s后flag修改为flase
ChangeFalse线程修改flag的值为: false
程序进入无限循环。
原因分析:
- 主线程读取自己的工作内存,发现
flag == true
,于是进入死循环。
- 子线程在 5 毫秒后修改了 flag 的值,但这个修改只反映在子线程的工作内存 中,主线程的工作内存并没有及时获取到该修改。
- 因此,主线程一直在死循环中,等待 flag 变为 false。
要解决上述的可见性问题,可以使用 volatile
关键字。将 flag 修改为 volatile boolean flag = true;
即可。
5. 源头之三:重排序问题
什么是重排序呢,我们先来看一段代码。
5.1. 重排序问题示例
public class OutOfOrderExecution {static int x = 0, y = 0;static int a = 0, b = 0;public static void main(String[] args) throws InterruptedException {int i = 0;for (; ; ) {i++;x = 0;y = 0;a = 0;b = 0;Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {a = 1;x = b;}});Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {b = 1;y = a;}});t1.start();t2.start();t1.join();t2.join();String result = "第" + i + "次(" + x + "," + y + ")";if (x == 0 && y == 0) {System.out.println(result);break;}}}
}
运行结果:
第111263次(0,0)
代码分析:
- 定义四个int类型的变量,初始化都为0;
- 定义两个线程t1、t2,t1线程修改a和x的值,t2线程修改b和y的值;
- 正常情况下会有三种结果:
- t1线程先执行,得到结果x=0、y=1;
- t2线程先执行,得到结果x=1、y=0;
- t1和t2线程同时执行,得到结果x=1、y=1。
而上面的打印出来的结果【0,0】。这就是的指令重排序问题。
重排序问题是指编译器、JVM或CPU为了优化性能,可能会改变程序中指令的执行顺序,导致程序的执行顺序与代码书写的顺序不一致。
假设上面的代码通过指令重排序之后,变成下面这种结构:
Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {x = b; //指令重排序a = 1;}
});Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {y = a; //指令重排序b = 1;}
});
经过重排序之后,如果t1和t2线程同时运行,就会得到x=0、y=0的结果。
解决方法:使用 volatile
或 synchronized
来禁止重排序,确保指令执行顺序。
6. 总结
线程不安全的根本原因主要有三个:
- 原子性问题:操作被拆分成多个步骤,多个线程同时执行时,操作可能会中断或交叉执行,导致数据错误。
- 可见性问题:源于缓存导致的不同线程工作内存与主内存不一致;
- 重排序问题:编译器、JVM或CPU出于性能优化目的可能改变指令执行顺序,导致程序执行结果与预期不一致。
这些技术优化的本意是提高程序性能,但在实现时会引入新的问题。因此,在编写并发程序时,我们必须清楚技术带来的潜在问题,并采取适当措施进行规避,才能确保程序稳定高效。
相关文章:
深入分析线程安全问题的本质
深入分析线程安全问题的本质 1. 并发编程背后的性能博弈2. 什么是线程安全问题?3. 源头之一:原子性问题3.1. 原子性问题示例3.2. 原子性问题分析3.3. 如何解决原子性问题? 4. 源头之二:可见性问题4.1. 为什么会有可见性问题&#…...
58. Three.js案例-创建一个带有红蓝配置的半球光源的场景
58. Three.js案例-创建一个带有红蓝配置的半球光源的场景 实现效果 本案例展示了如何使用Three.js创建一个带有红蓝配置的半球光源的场景,并在其中添加一个旋转的球体。通过设置不同的光照参数,可以观察到球体表面材质的变化。 知识点 WebGLRenderer …...
插入实体自增主键太长,mybatis-plaus自增主键
1、问题 spring-boot整合mybtais执行insert语句时,主键id为长文本数据。 2、分析问题 1)数据库主键是否自增 2)数据库主键的种子值设置的多少 3、解决问题 1)数据库主键设置的时自增 3)种子值是1 所以排查是数据库的问题 4、继…...
【利用 Unity + Mirror 网络框架、Node.js 后端和 MySQL 数据库】
要实现一个简单的1v1战斗小游戏,利用 Unity Mirror 网络框架、Node.js 后端和 MySQL 数据库,我们可以将其分为几个主要部分:客户端(Unity)、服务器(Node.js)和数据库(MySQL…...
https原理
一、基本概念 1、https概念 https(全称: Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的http通道,简单讲是http的安全版。 2、为啥说http协议不安全呢? 我们用h…...
如何处理京东商品详情接口返回的JSON数据中的缺失值?
1.在 Python 中处理缺失值 使用if - else语句进行检查和处理 假设通过requests库获取了接口返回的 JSON 数据,并使用json模块进行解析,存储在data变量中。 import json import requestsurl "YOUR_API_URL" response requests.get(url) dat…...
window对象
bom dom部分学完了,来看看bom吧~ bom是整个浏览器,本质上bom与dom是包含的关系,window是里面最大的对象 调用的方法默认对象是window,一般都会省略前面的window 创建的全局变量也是属于window的,当然window也可以省…...
(五)ROS通信编程——参数服务器
前言 参数服务器在ROS中主要用于实现不同节点之间的数据共享(P2P)。参数服务器相当于是独立于所有节点的一个公共容器,可以将数据存储在该容器中,被不同的节点调用,当然不同的节点也可以往其中存储数据,关…...
MySQL常用命令之汇总(Summary of Commonly Used Commands in MySQL)
MySQL常用命令汇总 简介 MySQL是一个广泛使用的开源关系型数据库管理系统,由瑞典的MySQL AB公司开发,现属于Oracle公司。 MySQL支持SQL(结构化查询语言),这是数据库操作的标准语言,用户可以使用SQL进…...
更新至2023年,各省数字经济变量/各省数字经济相关指标数据集(20个指标)
更新至2023年,各省数字经济相关指标数据集(20个指标) 1、时间:更新至2023年,具体时间如下 2、指标:互联网宽带接入端口(万个)(2006-2023)、互联网宽带接入用户(万户)(2…...
聚类系列 (二)——HDBSCAN算法详解
在进行组会汇报的时候,为了引出本研究动机(论文尚未发表,暂不介绍),需要对DBSCAN、OPTICS、和HDBSCAN算法等进行详细介绍。在查询相关资料的时候,发现网络上对于DBSCAN算法的介绍非常多与细致,但…...
【JavaEE】—— SpringBoot项目集成百度千帆AI大模型(对话Chat V2)
本篇文章在SpringBoot项目中集成百度千帆提供的大模型接口实现Chat问答效果: 一、百度智能云 百度千帆大模型平台是百度智能云推出的一个企业级一站式大模型与AI原生应用开发及服务平台。 注册地址:https://qianfan.cloud.baidu.com/ 注册成功后&…...
一种更激进的Hook实现方案猜想
XXX原创不原创不清楚,暂定为原创。毕竟windows 大神很多XXX 昨天才发现不是原创,这种方案是VEH HOOK的一种实现方案。VEH HOOK很久很久以前都被广泛使用了。只是自己没听说过。好悲哀呀。。。。 激进的猜想: 如果VEH HOOK在内核态处理异常…...
HTML5实现好看的端午节网页源码
HTML5实现好看的端午节网页源码 前言一、设计来源1.1 网站首页界面1.2 登录注册界面1.3 端午节由来界面1.4 端午节习俗界面1.5 端午节文化界面1.6 端午节美食界面1.7 端午节故事界面1.8 端午节民谣界面1.9 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 H…...
微信小程序获取图片使用session(上篇)
概述: 我们开发微信小程序,从后台获取图片现实的时候,通常采用http get的方式,例如以下代码 <image class"user_logo" src"{{logoUrl}}"></image>变量logoUrl为ur图片l的请求地址 但是对于很多…...
RT-DETR融合YOLOv9的下采样模块ADown
RT-DETR使用教程: RT-DETR使用教程 RT-DETR改进汇总贴:RT-DETR更新汇总贴 《YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information》 一、 模块介绍 论文链接:https://arxiv.org/abs/2402.13616 代码链接&…...
【机器学习案列】学生抑郁可视化及预测分析
🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...
CES 2025|美格智能高算力AI模组助力“通天晓”人形机器人震撼发布
当地时间1月7日,2025年国际消费电子展(CES 2025)在美国拉斯维加斯正式开幕。美格智能合作伙伴阿加犀联合高通在展会上面向全球重磅发布人形机器人原型机——通天晓(Ultra Magnus)。该人形机器人内置美格智能基于高通QC…...
Linux第一个系统程序---进度条
进度条---命令行版本 回车换行 其实本质上回车和换行是不同概念,我们用一张图来简单的理解一下: 在计算机语言当中: 换行符:\n 回车符:\r \r\n:回车换行 这时候有人可能会有疑问:我在学习C…...
黑马跟学.苍穹外卖.Day04
黑马跟学.苍穹外卖.Day04 苍穹外卖-day04课程内容1. Redis入门1.1 Redis简介1.2 Redis下载与安装1.2.1 Redis下载1.2.2 Redis安装 1.3 Redis服务启动与停止1.3.1 服务启动命令1.3.2 客户端连接命令1.3.3 修改Redis配置文件1.3.4 Redis客户端图形工具 2. Redis数据类型2.1 五种常…...
人生第一次面试之依托答辩
今天收到人生的第一场面试,是东华软件集团。答的那是依托答辩,就面了20分钟,还没考算法。其实依托答辩的效果是意料之中的,这次面试也只是想练练手。 目录 静态变量什么时候加载的? 重写和重载有什么区别࿱…...
STM32 : PWM 基本结构
这张图展示了PWM(脉冲宽度调制)的基本结构和工作流程。PWM是一种用于控制功率转换器输出电压的技术,通过调整信号的占空比来实现对负载的精确控制。以下是详细讲解: PWM 基本结构 1. 时基单元 ARR (Auto-reload register): 自动…...
【大模型(LLM)面试全解】深度解析 Layer Normalization 的原理、变体及实际应用
系列文章目录 大模型(LLMs)基础面 01-大模型(LLM)面试全解:主流架构、训练目标、涌现能力全面解析 02-【大模型(LLM)面试全解】深度解析 Layer Normalization 的原理、变体及实际应用 大模型&…...
《浮岛风云》V1.0中文学习版
《浮岛风云》中文版https://pan.xunlei.com/s/VODadt0vSGdbrVOBEsW9Xx8iA1?pwdy7c3# 一款有着类似暗黑破坏神的战斗系统、类似最终幻想的奇幻世界和100%可破坏体素环境的动作冒险RPG。...
学习threejs,导入babylon格式的模型
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.BabylonLoader babyl…...
Django 社团管理系统的设计与实现
标题:Django 社团管理系统的设计与实现 内容:1.摘要 本文介绍了 Django 社团管理系统的设计与实现。通过分析社团管理的需求,设计了系统的架构和功能模块,并使用 Django 框架进行了实现。系统包括社团信息管理、成员管理、活动管理、财务管理等功能&…...
2025 GitCode 开发者冬日嘉年华:AI 与开源的深度交融之旅
在科技的浪潮中,AI 技术与开源探索的火花不断碰撞,催生出无限可能。2025 年 1 月 4 日,由 GitCode 联合 CSDN COC 城市开发者社区精心打造的开年首场开发者活动:冬日嘉年华在北京中关村 • 鼎好 DH3-A 座 22 层盛大举行࿰…...
嵌入式系统 tensorflow
🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 探索嵌入式系统中的 TensorFlow:机遇与挑战一、TensorFlow 适配嵌入式的优势二、面临的硬件瓶颈三、软件优化策略四、实…...
Web无障碍
文章目录 🟢Web Accessibility-Web无障碍🟢一、Web Accessibility-Web1. web无障碍设计2. demo3.使用相关相关开源无障碍工具条(调用可能会根据网络有点慢) 如有其他更好方案,可以私信我哦✒️总结 🟢Web Accessibility-Web无障碍…...
Qt使用MySQL数据库(Win)----2.配置MySQL驱动
使用Everything软件,找到mysql.pro文件。并使用qt creator打开mysql.pro。 导入外部库 选择外部库 点击下一步,勾选。 为debug版本添加‘d’作为后缀取消勾选,然后点击下一步 添加后的Pro文件。 这样文件应该是改好了,选择releas…...
记录一下vue2项目优化,虚拟列表vue-virtual-scroll-list处理10万条数据
文章目录 封装BrandPickerVirtual.vue组件页面使用组件属性 select下拉接口一次性返回10万条数据,页面卡死,如何优化??这里使用 分页 虚拟列表(vue-virtual-scroll-list),去模拟一个下拉的内容…...
java 中 main 方法使用 KafkaConsumer 拉取 kafka 消息如何禁止输出 debug 日志
pom 依赖: <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><version>2.5.14.RELEASE</version> </dependency> 或者 <dependency><groupId>org.ap…...
前端性能优化全攻略:加速网页加载,提升用户体验
前端性能优化全攻略:加速网页加载,提升用户体验 在当今互联网时代,用户对于网页的加载速度和性能要求越来越高。一个快速响应、流畅加载的网页能够极大地提升用户体验,增加用户留存率和满意度。前端性能优化是实现这一目标的关键…...
关于内网外网,ABC类地址,子网掩码划分
本文的三个关键字是:内网外网,ABC类地址,子网掩码划分。围绕以下问题展开: 如何从ip区分外网、内网?win和linux系统中,如何查询自己的内网ip和外网ip。开发视角看内外网更多是处于安全考虑,接口…...
【C++多线程编程:六种锁】
目录 普通互斥锁: 轻量级锁 独占锁: std::lock_guard: std::unique_lock: 共享锁: 超时的互斥锁 递归锁 普通互斥锁: std::mutex确保任意时刻只有一个线程可以访问共享资源,在多线程中常用于保…...
【LeetCode】力扣刷题热题100道(16-20题)附源码 容器 子数组 数组 连续序列 三数之和(C++)
目录 1.盛最多水的容器 2.和为K的子数组 3.最大子数组和 4.最长连续序列 5.三数之和 1.盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴…...
WHAT - devicePixelRatio 与像素分辨率
目录 语法理解 devicePixelRatio常见值应用场景注意事项在高分辨率屏幕下的视觉效果 devicePixelRatio 是一个浏览器属性,用来表示设备的物理像素与 CSS 像素之间的比例。它是屏幕显示清晰度的重要指标,特别是在高分辨率屏幕(如 Retina 显示屏…...
【cs.CV】25.1.8 arxiv更新速递
—第1篇---- ===== ConceptMaster: 面向扩散Transformer模型的多概念视频定制,无需测试时调优 🔍 关键词: 文本到视频生成, 扩散模型, 多概念定制, 身份解耦 链接1 摘要: 文本到视频生成通过扩散模型取得了显著进展。然而,多概念视频定制(MCVC)仍然是一个重大挑战。…...
C#使用MVC框架创建WebApi服务接口
第一步,使用VS2019新建MVC-Web API应用程序 创建BridgeApi 第二步,运行将生成默认的示例网页,网页Url为 https://localhost:44361/home/index 右键 项目 添加 WebAPI控制器类 添加 我们可以看到App_Start目录下 有三个文件: BundleConfig.cs代表 捆绑文件的引用 有脚本文件…...
慧集通(DataLinkX)iPaaS集成平台-智能体(Agent)API
功能简介: 该功能下主要是用来管理集成平台对外开放接口得管控以及调用日志信息得查看操作,并支持日志得重放等操作;注:所有触发类单据得日志也可以在此查看(如使用数据触发组件自动触发流程得日志信息) 1.第三方调用接口类日志查…...
BigDecimal:高精度数值运算类
介绍: BigDecimal是一个用于高精度数值运算的类,它比基本的double或float类型更精确,非常适合需要精确计算的场景,如金融计算、科学计算等,因为这些领域对数值精度要求非常高,不能容忍浮点运算带来的误差。…...
11. C 语言 作用域与变量使用技巧
本章目录: 前言一、作用域的分类局部变量示例: 全局变量示例:示例: 形式参数示例: 二、作用域的细节与常见误区块级作用域示例: 静态变量与全局变量的对比示例: 未初始化变量的影响示例: 三、实…...
大模型WebUI:Gradio全解11——Chatbots:融合大模型的多模态聊天机器人(2)
大模型WebUI:Gradio全解11——Chatbots:融合大模型的聊天机器人(2) 前言本篇摘要11. Chatbot:融合大模型的多模态聊天机器人11.2 使用流行的LLM库和API11.2.1 Llama Index11.2.2 LangChain11.2.3 OpenAI1. 基本用法2. …...
课题推荐——基于GPS的无人机自主着陆系统设计
关于“基于GPS的无人机自主着陆系统设计”的详细展开,包括项目背景、具体内容、实施步骤和创新点。如需帮助,或有导航、定位滤波相关的代码定制需求,请点击文末卡片联系作者 文章目录 项目背景具体内容实施步骤相关例程MATLAB例程python例程 …...
HQChart使用教程30-K线图如何对接第3方数据44-DRAWPIE数据结构
HQChart使用教程30-K线图如何对接第3方数据44-DRAWPIE数据结构 效果图DRAWPIEHQChart代码地址后台数据对接说明示例数据数据结构说明效果图 DRAWPIE DRAWPIE是hqchart插件独有的绘制饼图函数,可以通过麦语法脚本来绘制一个简单的饼图数据。 饼图显示的位置固定在右上角。 下…...
张朝阳惊现CES展,为中国品牌 “代言”的同时,或将布局搜狐新战略!
每年年初,科技圈的目光都会聚焦在美国拉斯维加斯,因为这里将上演一场被誉为 “科技春晚” 的年度大戏 ——CES 国际消费电子展。作为全球规模最大、最具影响力的科技展会之一,CES 吸引了来自 160 多个国家的创新者和行业领导者,是…...
堆排序+选择排序详解
目录 1.选择排序的定义 2.选择排序的优缺点 2.1优点 2.2缺点 3.思考 4.优化后的选择排序的实现 5.选择排序的代码 6.堆排序 7.向上/向下调整算法 8. 向下向上调整代码 9.堆排序代码 1.选择排序的定义 选择排序(SelectSort),以第一个为开始值,…...
【Arthas命令实践】heapdump实现原理
🎮 作者主页:点击 🎁 完整专栏和代码:点击 🏡 博客主页:点击 文章目录 使用原理 使用 dump java heap, 类似 jmap 命令的 heap dump 功能。 【dump 到指定文件】 heapdump arthas-output/dump.hprof【只 …...
python-leetcode-判断子序列
392. 判断子序列 - 力扣(LeetCode) class Solution:def isSubsequence(self, s: str, t: str) -> bool:i, j 0, 0 # i 指向 s,j 指向 twhile i < len(s) and j < len(t):if s[i] t[j]:i 1j 1return i len(s)...
【Verdi实用技巧-Part2】
Verdi实用技巧-Part2 2 Verdi实用技巧-Part22.1 Dump波形常用的task2.1.1 Frequently Used Dump Tasks2.1.2 Demo 2.2 提取波形信息小工具--FSDB Utilities2.3 Debug in Source code view2.3.1 Find Scopes By Find Scope form 2.3.2 Go to line in Souce code View2.3.3 Use B…...