1,是什么

是一套规范、内存操作指导

解决多线程编程的 程序的 原子性,有序性,可见性(主要)的问题。

多核操作系统,会存在缓存不一致的情况,说到底是一个同步的问题.

2, 内容

内存模型,除了定义了一套规范,还提供了一系列原语,封装了底层实现后,供开发者直接使用。

go 中:概括 (按照如下规范 使用 channel、sync 等进行同步)

在单独的goroutine中先行发生的顺序即是程序中表达的顺序。

    如果包p引入(import)包q,那么q的init函数的结束先行发生于p的所有init函数开始main.main函数的开始发生在所有init函数结束之后  

    在channel的发送操作先行发生于对应的接收操作完成
对channel的关闭先行发生于接收到零值,因为channel已经被关闭了。
无缓冲channel的接收先行发生于发送完成
在容量为C的channel上的第k个接收先行发生于从这个channel上的第k+C次发送完成。
对任意的sync.Mutex或sync.RWMutex变量l和n < m,n次调用l.Unlock()先行发生于m次l.Lock()返回
对于sync.RWMutex变量l,任意的函数调用l.RLock满足第n次l.RLock后发生于第n次调用l.Unlock,对应的l.RUnlock先行发生于第n+1次调用l.Lock(此处luck、为写锁)。 通过once.Do(f)执行f()先行发生(指f()返回)于其他的once.Do(f)返回。

2,参考链接

建议阅读,有助于理解

go: https://segmentfault.com/a/1190000008230146

java :

http://www.hollischuang.com/archives/2509

https://juejin.im/post/5b42c01ee51d45194e0b819a

golang 内存模型的更多相关文章

  1. Golang内存模型

    Ref: https://golang.org/ref/mem 简介 golang内存模型,主要说明了如下问题.在一个goroutine中读取变量,而该变量是由其他goroutine赋值的,这种情况下 ...

  2. golang的内存模型与new()与make()

    要彻底理解new()与make()的区别, 最好从内存模型入手. golang属于c family, 而c程序在unix的内在模型: |低地址|text|data|bss|heap-->|unu ...

  3. golang学习笔记 ---面向并发的内存模型

    Go语言是基于消息并发模型的集大成者,它将基于CSP模型的并发编程内置到了语言中,通过一个go关键字就可以轻易地启动一个Goroutine,与Erlang不同的是Go语言的Goroutine之间是共享 ...

  4. Golang面向并发的内存模型

    Import Advanced Go Programming 1.5 面向并发的内存模型 在早期,CPU都是以单核的形式顺序执行机器指令.Go语言的祖先C语言正是这种顺序编程语言的代表.顺序编程语言中 ...

  5. 从GO内存模型与调用协议理解defer closure的坑

    资料参考: 官网defer介绍: https://blog.golang.org/defer-panic-and-recover 深入解析go: 多值返回: https://tiancaiamao.g ...

  6. 栈 堆 stack heap 堆内存 栈内存 内存分配中的堆和栈 掌握堆内存的权柄就是返回的指针 栈是面向线程的而堆是面向进程的。 new/delete and malloc/ free 指针与内存模型

    小结: 1.栈内存 为什么快? Due to this nature, the process of storing and retrieving data from the stack is ver ...

  7. Java内存模型深度解析:总结--转

    原文地址:http://www.codeceo.com/article/java-memory-7.html 处理器内存模型 顺序一致性内存模型是一个理论参考模型,JMM和处理器内存模型在设计时通常会 ...

  8. JVM学习(3)——总结Java内存模型

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 为什么学习Java的内存模式 缓存一致性问题 什么是内存模型 JMM(Java Memory Model)简 ...

  9. 浅析java内存模型--JMM(Java Memory Model)

    在并发编程中,多个线程之间采取什么机制进行通信(信息交换),什么机制进行数据的同步? 在Java语言中,采用的是共享内存模型来实现多线程之间的信息交换和数据同步的. 线程之间通过共享程序公共的状态,通 ...

随机推荐

  1. 3、if和while语句

    a=1 b=2 if a<b: print("Yes") print("Yes") print("Yes") print(" ...

  2. React(17)异步组件

    26.异步组件当在React里使用异步组件时,核心知识是两个: webpack 如何异步加载其他模块:通过 require(['xxx'], function(module){})来实现:React ...

  3. SimpleDateFormat 常用用法

    1.SimpleDateFormat函数语法:                   G 年代标志符          y 年          M 月          d 日          h ...

  4. .Net Core项目管理----Git的一些基本使用方法

    使用git的基本操作 1.Git的克隆 git clone https://XXXXXXXXXXXXXXXXXXXXX 2.拉取 git pull 3.查询状态 git status 4.添加 git ...

  5. oracle wallet使用与维护

    oracle wallet使用与维护2015年05月26日 17:58:55 SilenceRiver 阅读数:1614oracle wallet使用与维护---oracle无密码登录分类: Orac ...

  6. django orm 及常用参数

    一些说明: 表myapp_person的名称是自动生成的,如果你要自定义表名,需要在model的Meta类中指定 db_table 参数,强烈建议使用小写表名,特别是使用MySQL作为后端数据库时. ...

  7. ffmypeg 视频处理类库使用方法

    (经常用到ffmpeg 做一些视频数据的处理转换等,用来做测试,今天总结了一下,参考了网上部分朋友的经验,一起在这里汇总了一下,有需要的朋友可以收藏测试一下,有问题欢迎在下面回帖交流,谢谢;by te ...

  8. 宏定义define和const的区别

    define和const都可以用来定义常量,define的格式为:#define 标识符 字符串,const在定义常量前面,const类型定以后不能被修改,区别主要有如下几点: 1.编译器处理方式不同 ...

  9. ssh-copy-id使用非默认22端口时

    http://blog.sina.com.cn/s/blog_541a3cf10101epzf.html

  10. Springboot @Transactional Mysql事务 无效

    JPA默认创建的表是MyISAM引擎,MyISAM引擎不支持事务操作 所以需要将将数据库引擎改为InnoDB 配置修改 spring.jpa.database-platform=org.hiberna ...