首页
学习
活动
专区
圈层
工具
发布

为什么 StringBuilder 不是线程安全的?

我:StringBuilder不是线程安全的,StringBuffer是线程安全的 面试官:那StringBuilder不安全的点在哪儿? 我:。。。...(哑巴了) 在这之前我只记住了StringBuilder不是线程安全的,StringBuffer是线程安全的这个结论,至于StringBuilder为什么不安全从来没有去想过。...我们看到输出了“9326”,小于预期的10000,并且还抛出了一个ArrayIndexOutOfBoundsException异常(异常不是必现)。...这就是为什么测试代码输出的值要比10000小的原因。 2、为什么会抛出ArrayIndexOutOfBoundsException异常。...至此,StringBuilder为什么不安全已经分析完了。如果我们将测试代码的StringBuilder对象换成StringBuffer对象会输出什么呢? 当然是输出10000啦!

92320

为什么 StringBuilder 不是线程安全的?

我:StringBuilder不是线程安全的,StringBuffer是线程安全的 面试官:那StringBuilder不安全的点在哪儿? 我:。。。...(哑巴了) 在这之前我只记住了StringBuilder不是线程安全的,StringBuffer是线程安全的这个结论,至于StringBuilder为什么不安全从来没有去想过。...我们看到输出了“9326”,小于预期的10000,并且还抛出了一个ArrayIndexOutOfBoundsException异常(异常不是必现)。...这就是为什么测试代码输出的值要比10000小的原因。 2、为什么会抛出ArrayIndexOutOfBoundsException异常。...至此,StringBuilder为什么不安全已经分析完了。如果我们将测试代码的StringBuilder对象换成StringBuffer对象会输出什么呢? ? 当然是输出10000啦!

86920
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    为什么 StringBuilder 不是线程安全的?

    我:StringBuilder不是线程安全的,StringBuffer是线程安全的 面试官:那StringBuilder不安全的点在哪儿?我:。。。...(哑巴了) 在这之前我只记住了StringBuilder不是线程安全的,StringBuffer是线程安全的这个结论,至于StringBuilder为什么不安全从来没有去想过。...我们先不管代码的第五行和第六行干了什么,直接看第七行,count += len不是一个原子操作。...这就是为什么测试代码输出的值要比10000小的原因。 2、为什么会抛出ArrayIndexOutOfBoundsException异常。...至此,StringBuilder为什么不安全已经分析完了。如果我们将测试代码的StringBuilder对象换成StringBuffer对象会输出什么呢? ? 当然是输出10000啦!

    78030

    为什么 StringBuilder 不是线程安全的?

    我:StringBuilder 不是线程安全的,StringBuffer 是线程安全的 面试官:那 StringBuilder 不安全的点在哪儿? 我:。。。...(哑巴了) ❞ 在这之前我只记住了 StringBuilder 不是线程安全的,StringBuffer 是线程安全的这个结论,至于 StringBuilder 为什么不安全从来没有去想过。...StringBuilder线程安全 我们看到输出了“9326”,小于预期的 10000,并且还抛出了一个 ArrayIndexOutOfBoundsException 异常(异常不是必现)。...这就是为什么测试代码输出的值要比 10000 小的原因。 2、为什么会抛出 ArrayIndexOutOfBoundsException 异常。...至此,StringBuilder 为什么不安全已经分析完了。如果我们将测试代码的 StringBuilder 对象换成 StringBuffer 对象会输出什么呢? 当然是输出 10000 啦!

    65420

    从源代码理解atomic为什么不是线程安全

    所以面试的时候如果举这个例子~~说明你就没明白atomic的非线程安全性! 首先你得知道什么是线程不安全,线程的不安全是由于多线程访问和修改共享资源而引起的不可预测的结果(有可能crash)。...(UIImage *)atomicImage { @synchronized (self) { return _atomicImage; } } 源代码分析atomic为什么不是线程安全...其实现在一想很奇怪,为什么要把atomic和线程安全联系在一起去探究;atomic只是对属性的getter/setter方法进行了加锁操作,这种安全仅仅是get/set的读写安全,仅此之一,但是线程安全还有除了读写的其他操作...} }); 结果可能是[10000,20000]之间的某个值,而我们想要的结果是20000;很明显这个例子就会引起线程隐患,而atomic并不能防止这个问题;所以我们说atomic不是线程安全...既然被弃用了,这里为什么还在用;原因是进入spinlock去看会发现,底层已经被os_unfair_lick替换: using spinlock_t = mutex_tt; class

    2.3K20

    过拟合不是坏事,是信号:安全攻防中的模型调试艺术

    然而,在安全攻防场景下,过拟合却可以成为重要的调试信号,帮助安全工程师理解模型的行为和局限性。...记忆训练数据:模型记住了训练数据的细节,而不是学习到通用的模式。...2.3 过拟合的新视角:从问题到信号 将过拟合视为信号而非问题,需要转变以下观念: 从避免到利用:不再单纯避免过拟合,而是利用过拟合来调试模型和分析数据。...技术深度拆解与实现分析 3.1 过拟合的产生机制与信号价值 Mermaid流程图: 3.2 安全场景下的过拟合分析架构 Mermaid架构图: 渲染错误: Mermaid 渲染失败: Parse error...更好的安全防护:理解模型的弱点,可以针对性地加强安全防护措施。 更高效的调试:将过拟合作为调试信号,可以更高效地定位和解决模型问题。

    16810

    为什么使用OPA而不是原生的Pod安全策略?

    /www.magalix.com/blog/enforce-pod-security-policies-in-kubernetes-using-opa 在本文中,我们将演示如何使用OPA执行最细粒度的安全策略...,可以在其中对Pod应用非常特定的安全控制。...为什么使用OPA而不是原生的Pod安全策略? 使用Pod安全策略来执行我们的安全策略并没有什么问题。然而,根据定义,PSP只能应用于pods。...请注意,我们使用的OPA是使用kube-mgmt部署的,而不是OPA Gatekeeper。 Rego的策略代码 在本文中,我们假设你已经熟悉了OPA和Rego语言。...它包括容器名称和违规的安全上下文。 第7-9行:input_containers[c]函数从请求对象中提取容器。注意,使用了_字符来遍历数组中的所有容器。

    1.6K20

    linux系统编程之基础必备(六):可重入函数、线程安全、volatile

    以上三者的关系为:可重入函数 必然 是 线程安全函数 和 异步信号安全函数; 线程安全函数不一定是可重入函数。...举个例子,strtok是既不可重入的,也不是线程安全的;加锁的strtok不是可重入的,但线程安全;而strtok_r 既是可重入的,也是线程安全的。...也就是说函数如果使用静态变量,通过加锁后可以转成线程安全函数,但仍然有可能不是可重入的。我们所熟知的malloc 也是线程安全但不是可 重入的。        ...假设该函 数在某次执行过程中,在已经获得资源锁之后,有异步信号发生,程序的执行流转交给对应的信号处理函数;再假设在该信号处理函数中也需要调用函 数 func(),那么func()在这次执行中仍会在访问共享资源前试图获得资源锁...信号处理函数是一个单独的控制流程,因为它和主控制流程是异步的,二者不存在调用和被调用的关系,并且使用不同的堆栈空间。

    1.5K20

    【嵌入式Linux应用开发基础】vfork()函数

    修改了父进程的栈变量 int x = 10; printf("Child: x=%d\n", x); // 调用非异步信号安全函数 // 未调用 exec/_exit,直接返回...禁止调用非异步信号安全函数 限制:子进程只能调用异步信号安全函数(如 _exit、exec 系列),禁止调用 printf、malloc、pthread 等函数。...注意信号处理 信号传递:子进程会继承父进程的信号处理函数,但父进程在阻塞期间可能错过信号。 安全实践:在 vfork() 前屏蔽信号,或在父进程中统一处理。...小结:关键注意事项速查表 禁止行为 后果 安全替代方案 子进程修改内存 父进程数据损坏 仅调用 exec() 或 _exit() 子进程调用非异步安全函数 死锁、未定义行为 使用 write() 等安全函数...若非必要,建议优先选择更安全的 fork() 或 posix_spawn()。 五、常见问题 5.1. 为什么子进程必须立即调用 exec() 或 _exit()?

    9910

    第 1 期:为什么企业漏洞永远修不完?安全的真正职责不是扫描,而是风险决策

    系列文章引言为什么我们总在“救火”?——系列开篇语您是否正在被无休止的漏洞告警淹没?您的安全团队是否因常年充当“补丁催收员”而被业务部门抱怨?...在接下来的五期内容中,我们将逐步揭示:•第1期(本期):我们将直击痛点,阐明为什么企业漏洞永远修不完?安全的真正职责不是扫描,而是风险决策。...第1期:为什么企业漏洞永远修不完?安全的真正职责不是扫描,而是风险决策一、今天安全行业的最大误区把“查漏洞”当成价值,把“修漏洞”当成结果。...二、安全团队真正的核心价值是什么?不是“扫描工具的操作员”,也不是“补丁催收员”,而是:✔风险决策者(RiskDecisionMaker)负责回答关键问题:这批资产中有哪些漏洞是真风险?...真正优秀的企业安全能力,不是修掉所有漏洞,而是:把最少的资源投入到最高价值的风险上。

    17310

    嵌入式Linux:线程中信号处理

    该函数与 sigqueue() 类似,但它是将信号发送给指定的线程,而不是整个进程: int pthread_sigqueue(pthread_t thread, int sig, const union...异步信号安全函数是指那些可以在信号处理程序中调用的函数。...这些函数必须是可重入的,能够在信号处理期间中断正常执行流程而不会引发不一致行为。 Linux 提供了一组异步信号安全的系统调用,例如: 上表列出的这些函数被认为是异步信号安全函数。...反之,像 printf()、malloc() 等函数并不安全,因为它们可能涉及内部的缓冲机制或全局状态,容易在信号处理中引发竞争条件。...使用异步信号安全函数:在编写信号处理函数时,尽量只调用那些已知的异步信号安全函数,如 write()、_exit() 等,避免使用 malloc()、free() 或 printf() 这样的非异步信号安全函数

    65310

    使用可重入函数进行更安全的信号处理

    信号的生成和处理尤其增加了额外的复杂性。由于信号在本质上是异步的,所以难以找出当信号处理函数触发某个不可重入函数时导致的 bug。...信号和不可重入函数 信号(signal) 是软件中断。它使得程序员可以处理异步事件。为了向进程发送一个信号,内核在进程表条目的信号域中设置一个位,对应于收到的信号的类型。...如果当进程正在使用 malloc 在它的堆上分配额外的内存时,您通过信号处理器调用 malloc,那会怎样?或者,调用了正在处理全局数据结构的某个函数,而在信号处理器中又调用了同一个函数。...使用信号的另一个新增的困难是,只通过运行测试用例不能够确保代码没有信号 bug。这一困难的原因在于信号生成本质上异步的。...不过这必须要小心进行,因为将一个对象添加到一个链并不是原子操作,如果它被另一个做同样动作的信号处理器打断,那么就会“丢失”一个对象。

    1.9K20

    知识总结:C++工程师106道面试题总结(含答案详解)

    Dynamic_cast:针对基类和派生类指针和引用转换,基类和派生类之间必须要继承关系,是安全的    Reinterpret_cast:允许将任何指针类型转为其他指针类型,是安全的  Malloc...进程:共享内存,消息队列传递,无名管道,有名管道,信号,套接字    线程:锁机制,信号量,信号  IO模型主要有哪些?   阻塞,非阻塞,IO多路复用,异步  阻塞和非阻塞?...同步与异步的区别?   自己领悟  Select,poll和epoll的区别?为什么?  ...信号量;管程;  什么是信号?   进程间通信机制中唯一的异步通信机制  kill函数的每一个参数的作用?  ...为什么?   不可以,因为string不是类  Char * const *(*next)()是什么?

    3.8K90

    我的大厂面试经历(附100+面试题干货)

    Dynamic_cast:针对基类和派生类指针和引用转换,基类和派生类之间必须要继承关系,是安全的    Reinterpret_cast:允许将任何指针类型转为其他指针类型,是安全的  8:Malloc...进程:共享内存,消息队列传递,无名管道,有名管道,信号,套接字    线程:锁机制,信号量,信号  55:IO模型主要有哪些?   阻塞,非阻塞,IO多路复用,异步  56:阻塞和非阻塞?...同步与异步的区别?   自己领悟  57:Select,poll和epoll的区别?为什么?  ...信号量;管程;  67:什么是信号?   进程间通信机制中唯一的异步通信机制  68:kill函数的每一个参数的作用?  ...为什么?   不可以,因为string不是类  104:Char * const *(*next)()是什么?

    1.6K20

    可重入函数对于线程安全的意义(附函数表)

    可重入函数可以有多余一个任务并发使用,而不必担心数据错误,相反,不可重入函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在 代码的关键部分禁用中断)。...为什么 为什么有的函数可重入,又有的函数不可重入?...为什么不可重入 不可重入的特点:如果一个函数符合以下条件之一则是不可重入的 (1)调用了malloc/free函数,因为malloc函数是用全局链表来管理堆的 (2)调用了标准I/O库函数,标准I...编写可重入函数时,若使用全局变量,则应通过关中断、信号量(即P、V操作)等手段对其加以保护。 举例 Linux下常见可重入函数 ?...(4)、如果一个函数中有全局变量,那么这个函数既不是线程安全也不是可重入的。

    3.1K30

    【Linux系统编程】(三十八)进程信号拓展:可重入函数 volatileSIGCHLD 全解析

    ; 调用 malloc/free:malloc/free 通过全局链表管理堆内存,重入会导致堆结构错乱; 调用标准 I/O 库函数:如 printf、scanf、fopen 等,标准 I/O 库的实现依赖全局数据结构...1.6 高频面试题:为什么 printf 不能在信号处理函数中调用?...答案: printf 是标准 I/O 库函数,不是系统调用,其实现依赖全局的缓冲区结构; 主程序执行 printf 时,会操作缓冲区,若此时被信号中断,信号处理函数中再调用 printf,会导致缓冲区的重入访问...,都会向父进程发送 SIGCHLD 信号; 默认处理动作:忽略(SIG_IGN),这也是僵尸进程产生的根本原因 —— 父进程默认忽略该信号,不做任何回收操作; 异步通知:子进程退出是异步的,SIGCHLD...4.1 为什么需要区分用户态和内核态?

    12310

    【Linux系统】进程信号:信号的处理

    信号处理函数的限制 由于信号处理函数的执行上下文特殊,它受到很多限制: 只能调用异步信号安全的函数(如 write,但不能调用 printf、malloc 等) 需要避免处理全局数据时的竞态条件...,从这里恢复执行 return -EINTR; } 为什么使用 pause() 而不是空循环?...信号安全函数清单(POSIX标准) 仅允许调用以下异步信号安全函数: // 典型信号安全函数 _Exit() abort() accept() access() alarm().../O缓冲区 任何非异步信号安全函数 2....不是立即处理,而是在"合适的时候"处理 异步性:信号可能在任何时间点到达,进程无法预测其确切到达时间。 处理时机:信号的处理发生在进程从内核态返回用户态之前。

    29710

    UIUC CS241 讲义:众包系统编程书

    信号处理程序内的可执行代码受到严格限制。大多数库和系统调用都不是“异步信号安全”的 - 它们不能在信号处理程序内使用,因为它们不是可重入安全的。...信号处理程序内部的可执行代码有严格的限制。大多数库和系统调用都不是“异步信号安全”的 - 它们不能在信号处理程序内部使用,因为它们不是可重入安全的。...编写自定义信号处理线程(如下面的示例)的一个优点是,现在您可以使用更多的 C 库和系统函数,否则不能安全地在信号处理程序中使用,因为它们不是异步信号安全的。...为什么要使用 sigaction 而不是 signal? 我如何异步和同步地捕获信号? 在我 fork 后,挂起的信号会怎样?Exec? 我 fork 后我的信号处理怎么样?...信号:复习问题 给出通常由内核生成的两个信号的名称 给出一个不能被信号捕获的信号的名称 为什么在信号处理程序中调用任何函数(不是信号处理程序安全的函数)是不安全的?

    1.3K10

    扒虫篇-Debug几个实用的方法

    C语言是一门危险的语言,内存安全是一个主要的问题。C语言中根本没有内存安全可言。...像下面的代码,会被正常的编译,而且可能正常运行: char *ptr = malloc(5); ptr[12] = 0; 对于内存安全的验证已经有一些解决方案了。...如Clang的静态代码分析,可以从代码中查找特定类型的内存安全问题。如Valgrind之类的程序可以在运行时检测到不安全的内存访问。 Address Sanitizer是另外一种解决方案。...malloc函数总是最少分配16个字节。为了储存针对标准malloc的内存的保护,需要分配内存到16字节的范围内,因此,若分配的内存大小不是16字节的整数倍,余出的几个字节将不受保护。...它是一种异步的通知机制,用来提醒进程一个事件已经发生。当一个信号发送给一个进程,操作系统中断了进程正常的控制流程,此时,任何非原子操作都将被中断。

    2.2K10
    领券