首页 > 其他分享 >string 是否线程安全

string 是否线程安全

时间:2023-12-06 23:45:24浏览次数:31  
标签:wg func string goroutine 安全 线程 str

线程安全是什么

线程安全是指在多线程环境下,程序的执行能够正确地处理多个线程并发访问共享数据的情况,保证程序的正确性和可靠性。

type StringHeader struct {
   Data uintptr  //存放指针,其指向具体的存储数据的内存区域
   Len  int     //字符串的长度
}

并发访问

package main
 
import (
 "fmt"
 "sync"
)
 
func main() {
 var wg sync.WaitGroup
 str := "脑子进煎鱼了"
 for i := 0; i < 5; i++ {
  wg.Add(1)
  go func() {
   defer wg.Done()
   fmt.Println(str)
  }()
 }
 wg.Wait()
}

定义了一个 string 变量 str,然后启动了 5 个 goroutine,每个 goroutine 都会输出 str 的值。由于 str 是不可变类型,因此在多个 goroutine 中并发访问它是安全的。

不可变类型,指的是一种不能被修改的数据类型,也称为值类型(value type)。不可变类型在创建后其值不能被改变,任何对它的修改操作都会返回一个新的值,而不会改变原有的值。

并发写入

func main() {
 var wg sync.WaitGroup
 str := "脑子进煎鱼了"
 for i := 0; i < 5; i++ {
  wg.Add(1)
  go func() {
   defer wg.Done()
   str += "!" // 修改 str 变量
   fmt.Println(str)
  }()
 }
 wg.Wait()
}

在每个 goroutine 中向 str 变量中添加了一个感叹号。由于多个 goroutine 同时修改了 str 变量,因此可能会出现数据竞争的情况。

会发现程序输出结果会出现乱序或不一致的情况,可以确认 string 类型变量在多个 goroutine 中是不安全的。

string 实现线程安全

使用互斥锁(Mutex)来保护共享变量,确保同一时间只有一个goroutine 可以访问(互斥锁会带来一些性能上的开销)

 

【原子操作通常用于对基本类型(如整数、布尔值、指针等)的原子更改,而不是对字符串的修改】

 

标签:wg,func,string,goroutine,安全,线程,str
From: https://www.cnblogs.com/beatle-go/p/17880785.html

相关文章

  • 2023-2024 20232319《网络空间安全导论》第5周学习总结
    思维导图内容安全基础信息内容安全概述1.全球数据爆炸式发展->不良信息泛滥,带来恶劣影响->对于网络信息内容安全的关注->信息内容安全2.信息内容安全:是利用计算机从包含海量信息并且迅速变化的网络中对特定安全主题相关信息进行自动获取,识别和分析的技术。3.兼具学术......
  • Groovy StringBuilder类踩坑
    今天在写脚本的时候发现一个奇怪的错误。经过猜想验证,发现原来Groovy过于灵活了,算是重复踩了之前的坑。Groovy特性描述如下:当Groovy脚本调用getFun()和setFun()方法时,会默认给这个类有一个FunTester的属性。反过来,如果这个类有Fun这个属性,那么get和set方法是不用显式写出来的。本......
  • 线程中断方法详解interrupt
    线程中断方法详解interrupt由于stop中断线程方法过于暴力,就像是突然你正在开发,突然停电一样于是衍生出中断方法interrupt简介线程中断并不会使线程立即退出,而是给线程发送一个通知,告知目标线程,有人希望你退出了!至于目标线程接收到通知之后如何处理,则完全由目标线程自己决定Thread提......
  • CF1809D Binary String Sorting 题解
    题意:思路:贪心:单调不降的$01$字符串,一定是一串连续的$0$再加上一串连续的$1$。由于每次操作的代价很大,所以需要在操作次数尽可能少的情况下,尽可能多地使用交换操作。由于$1$次交换操作,只能减少$1$个逆序对,当存在多个逆序对时,优先通过删除操作减少逆序对的......
  • 基于多传感器融合的锂电池安全生产预警系统设计
    项目需求 在能源领域,由于很多地方都是无人值守,设备故障检测是一个必须面对的问题。笔者今年受邀帮该行业的客户做一个此类的项目,除了和客户的深入的沟通之外,还到他们工厂进行了实地参考考察。发现他们遇到的问题是一个行业普遍的问题。那就是由于车间都是无人车间,设备运行过程......
  • 为什么 idea 建议去掉 StringBuilder,使用“+”拼接字符串
    为什么idea建议去掉StringBuilder,使用“+”拼接字符串目录为什么idea建议去掉StringBuilder,使用“+”拼接字符串1、普通拼接2、循环拼接总结各位小伙伴在字符串拼接时应该都见过下面这种提示:内容翻译:报告StringBuffer、StringBuilder或StringJoiner的任何用法,这些用法......
  • crash —— 输出属于同一个进程的所有线程
    在创建进程或者线程的时候,会调用copy_process,可以看到如下逻辑: /*ok,nowweshouldbesetup..*/ p->pid=pid_nr(pid); if(clone_flags&CLONE_THREAD){ p->group_leader=current->group_leader; p->tgid=current->tgid; }else{ p->group_leader=......
  • 剖析 Tomcat 线程池与 JDK 线程池的区别和联系
    文章目录引言JDK线程池Tomcat线程池Tomcat连接器Tomcat的`Executor`Tomcat线程池配置区别和联系区别联系结论......
  • java字符串String类的常用方法
    java字符串String类的常用方法字符串的创建:(1)定义字符串直接赋值,在字符串池中开辟空间()Stringstr1=“Hello”;//在字符串池中写入字符串"hello"Stringstr2=“Hello”;//直接引用字符串池中的"Hello"System.out.println(str1==str2);//地址相同,输出:true(2)使用new关键字......
  • 安全帽佩戴识别系统
     安全帽佩戴识别系统用深度视觉分析技术对现场监控画面实时分析,依据现场已经部署的监控摄像头,实时监测识别现场的工作环境,分析工作人员是否佩戴安全帽,自动对施工作业区域的员工进行识别,如发现未按要求佩戴安全帽,会立即发出语音提醒;后台监控人员收到违规提示后立......