码迷,mamicode.com
首页 > 其他好文 > 详细

荣耀黄金

时间:2018-03-26 00:51:46      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:unlock   原子性   不可   特点   赋值   不同的   模型   访问   log   

多线程执行模型和特点

原子性:指一个操作是不可中断的,即使是在多个线程一起执行的时候,一个操作一旦开始不会被其他线程干扰

有序性:在并发时,程序的执行可能会出现乱序

技术分享图片

 

为什么会出现乱序?

一条指令的执行是可以分为很多步骤的,每个步骤是又CPU不同的部件执行,每条指令都对应如下这五个步骤
1.取指 IF
2.译码和取寄存器操作数 ID
3.执行或者有效地址计算 EX
4.存储器访问 MEM
5.写回 WB

 如A=B+C;这里其实是3个指令

读B,读C,B+C,赋值,那么他的执行顺序在CPU中其实是这样的

技术分享图片

图中的X是因为第二排指令还没有到MEM,所以没办法获取到C的值,就没办法计算,所以就先空出来,CUP对对这些指令进行进一步的优化,使得所有X都会被填充,这个过程称之为指令重排,正式因为这个原因,使得在并发时,程序的执行可能会出现乱序。

 

可见性:可见性是指当一个线程修改了某一个共享变量的值,其他线程是否能够立即知道这个修改

 编译器优化

 硬件优化(如写吸收,批操作)

 技术分享图片

 

Hapepen-Before规则

程序顺序原则:一个线程内保证语义的串行性,在代码层面上是按照顺序执行的
volatile规则:volatile变量的写,先发生于读,这保证了volatile变量的可见性
锁规则:解锁(unlock)必然发生在随后的加锁(lock)前
传递性:A先于B,B先于C,那么A必然先于C
线程的start()方法先于它的每一个动作
线程的所有操作先于线程的终结(Thread.join())
线程的中断(interrupt())先于被中断线程的代码
对象的构造函数执行结束先于finalize()方法

 

荣耀黄金

标签:unlock   原子性   不可   特点   赋值   不同的   模型   访问   log   

原文地址:https://www.cnblogs.com/zhuoqingsen/p/8647498.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!