StringBuilder和StringBuffer的区别
StringBuilder和StringBuffer的用法是一致的,平常我们最多用到的方法就是append()拼接字符串和reverse()翻转字符串等等。二者看起来方法是一样的,确实也是这样,其实它俩唯一的不同在于StringBuilder不是线程安全的,而StringBuffer则是线程安全的。
证明如下
验证StriingBuilder
我们分别用两个线程对同一StringBuilder对象追加不同的字符,查看结果
public static void main(String[] args) throws InterruptedException {StringBuilder builder = new StringBuilder();StringBuffer buffer = new StringBuffer();Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 1000; i++) {builder.append("A");}}});Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 1000; i++) {builder.append("B");}}});t1.start();t2.start();t1.join();t2.join();System.out.println(builder.toString());}
结果:
我们发现,线程1(追加字符‘a’)运行得好好的,突然线程2(追加字符‘b’)也加了进来,两个线程轮流对StringBuilder对象进行操作
此外,还发生了下标越界的报错,可能是因为两个线程在争夺资源的时候发生的错误,毕竟StringBuilder的底层其实是一个char数组,线程 A 想要在位置 i 插入字符,而线程 B 想要在相同的位置 i 插入不同的字符。这将导致一个或者两个操作执行失败或者得到错误结果。所以运行结果中不只有AB两种字符,还有一个类似乱码的字符

结论:StringBuilder不是线程安全的
验证StringBuffer
验证方法和上面一直,我们分别用两个线程对同一StringBuffer对象追加不同的字符,查看结果
public static void main(String[] args) throws InterruptedException {StringBuilder builder = new StringBuilder();StringBuffer buffer = new StringBuffer();Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 1000; i++) {buffer.append("A");}}});Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 1000; i++) {buffer.append("B");}}});t1.start();t2.start();t1.join();t2.join();System.out.println(buffer.toString());}
结果:
我们发现,尽管是两个线程,但是并没有因为抢占公共资源(同一个StringBuffer对象)而交替执行,而是很丝滑快速的执行完成,更没有报错。

结论:StringBuffer是线程安全的
总结
两个线程同时操作同一个 StringBuilder 对象,如果没有采取合适的同步机制,那么就会出现下标越界的错误。
在多线程环境下,由于线程调度是不可控的,两个线程可能同时访问同一个 StringBuilder 对象,并且同时调用 append() 或 insert() 等方法进行修改操作。由于 StringBuilder 不是线程安全的类,在并发访问时可能会出现以下问题:
1. 竞态条件:如果两个线程在同一时间进行 append() 或 insert() 操作,则可能会导致竞态条件。例如,线程 A 想要在位置 i 插入字符,而线程 B 想要在相同的位置 i 插入不同的字符。这将导致一个或者两个操作执行失败或者得到错误结果。
2. 内存可见性:如果两个线程分别持有 StringBuilder 的不同实例,并且每个实例都缓存了修改后的值,则另一个线程可能无法看到这些更改,因此应该使用 volatile 关键字保证内存可见性。
综上所述,为了避免 StringBuilder 下标越界错误和其他多线程问题,需要采取合适的同步机制来保证对 StringBuilder 的访问是互斥、有序和可见的。例如可以使用 synchronized 来锁住StringBuilder对象,或者使用 ConcurrentLinkedQueue<StringBuilder> 之类的线程安全容器来避免竞争条件。
因此,当我们今后使用的时候,需要注意场景。如果是比如多线程爬虫将爬到的内容拼接在一起的话,需要使用StringBuffer,而一般单线程的情况下可以使用StringBuilder。
相关文章:
StringBuilder和StringBuffer的区别
StringBuilder和StringBuffer的用法是一致的,平常我们最多用到的方法就是append()拼接字符串和reverse()翻转字符串等等。二者看起来方法是一样的,确实也是这样,其实它俩唯一的不同在于StringBuilder不是线程安全的,而StringBuffe…...
美团大数据开发转正实习面经(已OC)
一面面试体验整体很不错,面试官很温柔,也不会故意为难你。 一面(2023.3.21) 自我介绍简单介绍项目(研一在国电做的)你认为学习到的技术和实际使用的差距在哪项目中的数据都是哪里来的(集团中各种设备运行的数据)你说你用到了Spark那你介绍一下Spark的组件…...
leedcode刷题(2)
各位朋友们,又是新的一天,不知道大家过得怎样?今天是我leedcode刷题系列的第二篇,那么废话不多说,直接进入我们今天的主题。 文章目录有效的括号题目要求用例输入做题思路代码实现环形链表题目要求用例输入做题思路代码…...
0119 磁盘分区、挂载
1.Linux分区 1.Linux无论有几个分区,分给哪个目录使用,归根结底只有一个根目录,一个独立且唯一的文件结构,Linux中每个分区都是用来组成整个文件系统的一部分 2.Linux采用了一种叫“载入”的处理方法,它的整个文件系…...
【独家】华为OD机试 - 打折买水果(C 语言解题)
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本期题目:打折买水果 题目 有 m m m…...
python使用args,kwargs
使用*args, **kwargs 在Python中,*args和**kwargs分别用于在函数定义中处理可变数量的位置参数和关键字参数。这使得您可以在调用函数时传入任意数量的参数,而不需要在函数定义中为每个参数单独声明一个形参。 这里是它们的使用方法: *arg…...
20230408英语学习
Planting This Could Feed Millions and Lock Away Tons of Carbon 食用菌:新型蛋白质来源,还能固碳 The world hungers for more food while wildlife yearns for untouched habitats.So goes the conflict between our seemingly insatiable need for…...
ReplacingMergeTree
在 MergeTree 的基础上,添加了“处理重复数据”的功能,该引擎和MergeTree的不同之处在于它会删除具有相同(区内)排序⼀样的重复项。数据的去重只会在合并的过程中出现。合并会在未知的时间在后台进⾏(⼿动合并),所以你⽆法预先作出计划。有⼀…...
Java核心技术知识点笔记—集合(二)
1、树集(TreeSet):是一个有序集合(sorted collection),与散列集类似,但比散列集有所改进。 (1)可以以任意顺序将元素插入到集合中; (2ÿ…...
Sharepoint Online手工迁移方案 | 分享二
目录 前言 1.创建新的目标网站集合 2.备份旧网站集合的内容数据库 3.卸载旧网站集合...
MVC获取当前区域、控制器、Action
控制器中获取: 获取区域名称:RouteData.DataTokens["area"].ToString() 获取控制器名称:RouteData.Values["controller"].ToString() 获取Action名称:RouteData.Values["action"].ToString() 视…...
第十六章 脚手架文件介绍
react项目脚手架文件目录 public ---- 静态资源文件夹 |-------favicon.icon ------ 网站页签图标 |-------index.html -------- 主页面 |-------logo192.png ------- logo图 |-------logo512.png ------- logo图 |-------manifest.json ----- 应用加壳的配置文件 |-------rob…...
基于Clion开发(stm32移植FreeRTOS+LVGL)
嵌入式单片机开发中,通常使用 Keil IAR 或 芯片厂商提供的IDE,这类IDE界面风格还停留在十几年前XP风,代码编辑实在让人难受,所以很多时候笔者都是采用VSCode编辑,然后再用这类IDE下载调试使用,另外像keil 和…...
Python | 蓝桥杯进阶第三卷——动态规划
欢迎交流学习~~ 专栏: 蓝桥杯Python组刷题日寄 蓝桥杯进阶系列: 🏆 Python | 蓝桥杯进阶第一卷——字符串 🔎 Python | 蓝桥杯进阶第二卷——贪心 💝 Python | 蓝桥杯进阶第三卷——动态规划 ✈️ Python | 蓝桥杯进阶…...
蓝桥杯31天真题冲刺|题解报告|第二十九天
大家好,我是snippet,今天是我们刷题的第二十九天,今天主打打比赛,牛客AcWing力扣,今天的牛客是真的有趣,下面是我今天AcWing周赛的题解 目录 一、热身计算 题目链接:4944. 热身计算 - AcWing题…...
[Rust GUI]fltk-rs的helloworld
1、安装VSCode 下载安装VSCode 安装VSCode扩展 rust-analyzer或rust-analyzer(CN) 2、安装Microsoft C 生成工具 访问微软官网下载生成工具,勾选使用 C 的桌面开发之后会自动勾选5个项目 取消勾选以下项目 用于 Windows 的 C CMake 工具 测试工具核心功能 - 生成…...
蓝桥杯真题05
重新排序 问题描述 给定一个数组 A 和一些查询 Li,Ri 求数组中第 Li 至第 Ri个元素之和。 小蓝觉得这个问题很无聊, 于是他想重新排列一下数组, 使得最终每个查询结果的和尽可能地大。小蓝想知道相比原数组, 所有查询结果的总和最多可以增加多少? 输入格式 输入第一行包含…...
PMP那些事儿,备考小白看过来
一、PMP是什么? PMP指的是项目管理专业人士资格认证。它是由美国项目管理协会(Project Management Institute(PMI)发起的,严格评估项目管理人员知识技能是否具有高品质的资格认证考试。 其目的是为了给项目管理人员提供统一的行业标准。目前࿰…...
【数据分析实战】基于python对酒店预订需求进行分析
文章目录📚引言📖数据加载以及基本观察📑缺失值观察及处理🔖缺失值观察以及可视化🔖缺失值处理📖用户数据探索📑什么时间预定酒店将会更经济实惠?📑哪个月份的酒店预订是…...
【新2023Q2模拟题JAVA】华为OD机试 - 数组的中心位置
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:数组的中心位置 题目 给你一…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...
