即 as if serial 语义。 【单线程程序语义】 单线程内,无论怎样《 "重排序" 》,都不会影响程序的执行结果。 (下文称“语义”) 为了满足“语义”,编译器和处理器不会对存在依赖关系的操作进行重排序,因为这样做会改变执行结果。 “语义”让程序员认为,单线程程序就是按照程序顺序执行的,无需 ...
分类:
编程语言 时间:
2018-09-28 01:30:55
阅读次数:
183
谈谈Java中的volatile https://www.cnblogs.com/chengxiao/p/6528109.html 讲得很好 内存可见性 留意复合类操作 解决num++操作的原子性问题 禁止指令重排序 总结 ...
分类:
编程语言 时间:
2018-09-27 18:09:58
阅读次数:
146
高并发的问题:CPU多级缓存:缓存一致性,乱序执行优化 java内存模型:JMM规定,抽象结构,同步等八种操作及规则 java并发的优势和风险 线程安全性: 原子性: AtomicXXX:核心是Unsafe.compareAndSwapInt(CAS),将主存的值和预期值进行比较,如果相同才进行更新 ...
分类:
其他好文 时间:
2018-09-24 11:34:49
阅读次数:
169
功能要求: 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性 他先用计算机生成了N个1~1000之间的随机整数(N<=1000),N是用户输入的,对于 其中重复的数字,只保留一个,把其余相同的数字去掉,不同的数对应着不同的学生的学号,然后再把这些 数从小到大排序,按照排好的顺序去找同学做 ...
分类:
编程语言 时间:
2018-09-13 23:12:39
阅读次数:
930
一.final域的重排序规则 对于final域,编译器和处理器要遵循两个重拍序规则: 1.在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 2.初次读一个包含final域的对象的应用,与随后初次读这个final域,这两个操作之间不能重排 ...
分类:
编程语言 时间:
2018-08-31 21:29:33
阅读次数:
193
一、概念理解 首先我们先来了解一下什么是重排序:重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。 从Java源代码到最终实际执行的指令序列,会分别经历下面3种重排序,如下图所示 上述的1属于编译器重排序,2和3属于处理器重排序。这些重排序可能会导致多线程程序出现内存可见性 ...
分类:
移动开发 时间:
2018-08-31 21:28:00
阅读次数:
246
java内存模型的作用。 java内存模型定义了线程和线程和线程和主内存之间的抽象关系。每个线程有自己的内存区域,存的是从主内存复制过来的变量副本,他是一个抽象概念。 线程之间通信会通过主内存,将修改的数据刷新到主内存去,其他线程就能够获取到。 考虑到内存模型避不开指令重排序 为了提升性能,编译器和 ...
分类:
编程语言 时间:
2018-08-28 11:28:16
阅读次数:
157
volatile关键字修饰的共享变量主要有两个特点:1.保证了不同线程访问的内存可见性 2.禁止重排序 在说内存可见性和有序性之前,我们有必要看一下Java的内存模型(注意和JVM内存模型的区分) 为什么要有java内存模型? 首先我们知道内存访问和CPU指令在执行速度上相差非常大,完全不是一个数量 ...
分类:
其他好文 时间:
2018-08-27 18:10:40
阅读次数:
168
在执行程序时为了提高性能,编译器和处理器常常会对指令做重排序。重排序分三种类型: 编译器优化的重排序。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。 指令级并行的重排序。现代处理器采用了指令级并行技术(Instruction-Level Parallelism, ILP)来将多条 ...
分类:
编程语言 时间:
2018-08-22 20:40:50
阅读次数:
251
C#窗体控件DataGridView常用设置 在默认情况下,datagridview的显示效果:1.禁用最后一行空白。 默认情况下,最后一行空白表示自动新增行,对于需要在控件中进行编辑,可以保留dataGridView1.AllowUserToAddRows = false; 上述禁用,仅是将用户界 ...