美文网首页区块链研究
Golang里面string变量操作的原子性

Golang里面string变量操作的原子性

作者: 元家昕 | 来源:发表于2018-11-14 21:11 被阅读9次

string是Go的内建类型,但对它的读写操作并非线程安全的,原因在于它的内部实际上是通过struct存储的,我们可以在runtime/string.go里面看到它的内部定义。

我们可以通过一个简单的测试代码看到结果

测试代码 运行结果

可以看到在频繁的写入操作中,另一协程可能读到部分写入的结果(len为1,指针指向“aa,或者是len为2,指针指向了”0“)。

细心的读者可能会发现在写入协程中有一个多余的sleep操作,如果把这个sleep去掉,运行的结果是永远读不到脏数据,这是为什么呢?原因在于编译器的优化,通过go tool compile -S -S可以发现,如果去掉Sleep,编译器将会优化了所有的写入操作。通过汇编源码,我们也可以更直观的看到一个简单的string赋值操作的过程。

在并发场景下,string跟interface一样,都是需要使用atomic包来保证读写的原子性。

相关文章

  • Golang里面string变量操作的原子性

    string是Go的内建类型,但对它的读写操作并非线程安全的,原因在于它的内部实际上是通过struct存储的,我们...

  • 2018-02-28线程-线程池

    volatile 不能保证一般变量的操作原子性原因是由于 volatile 不能保证非原子性操作的一致性,eg变量...

  • Java并发学习之synchronized(一)

    synchronized 具有原子性,可见性。原子性:由java内存模型来直接保证的原子性变量操作包括read,l...

  • JAVA线程基础回顾及内存模型(二)

    原子性 可见性和有序性 原子性(Atomicity):由JMM直接保证原子性变量操作在上节的read\load,s...

  • 4、在论原子性、可见性和有序性

    一、原子性 1、原子性基本概念 原子性:对于涉及共享变量访问的操作,若 该操作从其执行线程以外的任何线程来看是不可...

  • 2018-07-12

    volatile不能保证原子性,所以用它修饰的变量,如果执行非原子性操作,那不能保证线程安全,比如++操作,但是=...

  • Java --Atomic(原子)

    原子性操作,在多线程下 该变量的操作是原子性的,不需要添加:synchronized 例子 启用100个线程,每个...

  • 分布式事务

    1、线程安全保证线程安全一般分成两种方式:锁和原子变量原子变量:原子变量能够保证原子性的操作,意思是某个任务在执行...

  • volatile/final

    对于单个 volatile变量的读/写具有原子性;复合操作不具有原子性,如 volatile++。 对 volat...

  • 并发编程的灵魂:CAS机制详解

    Java中提供了很多原子操作类来保证共享变量操作的原子性。这些原子操作的底层原理都是使用了CAS机制。在使用一门技...

网友评论

    本文标题:Golang里面string变量操作的原子性

    本文链接:https://www.haomeiwen.com/subject/eebcfqtx.html