1.volatile关键字的两层语义 一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。 2)禁止进行指令重排序。 先看一段代码,假如线 ...
分类:
其他好文 时间:
2021-07-02 15:31:10
阅读次数:
0
内存模型的基础 内存模型的抽象结构 共享变量 堆里面的对象、数组元素,静态变量(方法区) 局部变量 不会有线程可见性的问题,不会受内存模型的影响 指令重排 编译器优化的重排序 不改变单线程语义的前提下重新安排编译的顺序 --编译器 指令级并?的重排序 现在的处理器采用的技术,多条指令重叠进行,只要两 ...
分类:
其他好文 时间:
2021-06-23 16:42:19
阅读次数:
0
volatile 作用 保证线程可见性 使用volatile,将会强制所有线程都去堆内存中读取变量的值 -MESI(CPU的缓存一致性协议) 详细可看 https://www.cnblogs.com/z00377750/p/9180644.html 禁止指令重排序(CPU级别的支持) cpu级别增加 ...
分类:
编程语言 时间:
2021-06-08 23:17:33
阅读次数:
0
一、数组扁平化 有数组:let arr = [[2, 3, 1],[4, 3, 6, 5],[6, 2, 4, 9, [4, 11, 12, [12, 13, [10], 15]]], 20]1. reduce //若值为数组则递归遍历,否则concat function flatten(arr) ...
分类:
编程语言 时间:
2021-06-05 17:40:20
阅读次数:
0
并发编程-重排序 重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。 一、数据依赖性[相关] 若两个操作访问同一变量,且有一个为写操作,此时产生数据依赖性。数据以来分为下列 3 中类型: | 名称 | 代码示例 | 说明| | | | | | 写后读 | a = 1; b ...
分类:
编程语言 时间:
2021-05-24 06:06:37
阅读次数:
0
题目链接: https://www.nowcoder.com/practice/3245215fffb84b7b81285493eae92ff0?tpId=37&tqId=21226&rp=1&ru=%2Fta%2Fhuawei&qru=%2Fta%2Fhuawei%2Fquestion-ranki ...
分类:
编程语言 时间:
2021-04-07 11:06:20
阅读次数:
0
上篇文章记录到volatile在硬件层面怎么保证线程间可见性的,是通过lock锁缓存行缓存一致性协议来实现的。但是这样会有一个伪共享的问题。 首先缓存行在64bit机中一般为64字节,具体缓存行大小可以通过下面的命令查看: cat /proc/cpuinfo 假设有一个对象有两个long类型的数据x ...
分类:
编程语言 时间:
2021-04-02 13:27:35
阅读次数:
0
volatile的作用及原理 当一个变量被volatile修饰时,会拥有两个特性: 保证了不同线程对该变量操作的内存可见性.(当一个线程修改了变量,其他使用次变量的线程可以立即知道这一修改). 禁止了指令重排序. 1. 保证内存可见性 JMM操作变量的时候不是直接在主存进行操作的,而是每个线程拥有自 ...
分类:
编程语言 时间:
2021-02-18 13:42:21
阅读次数:
0
1.原子性(Atomicity) 定义:不可再分割的操作 Java内存模型直接保证原子性变量操作包括:read、load、assign、use、store 和 write 这6个 2.可见性(Visibility) 定义:是指当一个线程修改了一个共享变量的值时,其他线程能够立即的指这个修改 java ...
分类:
其他好文 时间:
2021-02-18 13:27:59
阅读次数:
0
set 其作用是去重,排序。 set常用操作: #include<set> //声明一个set容器 set<typename> s;//定义,typename为数据类型,假设定义了一个容器s //常用操作: s.insert(x);//将x插入set容器中,并自动排序,去重 s.find(value ...
分类:
其他好文 时间:
2021-02-16 12:32:19
阅读次数:
0