码迷,mamicode.com
首页 > 编程语言 > 详细

线程执行的几种特性(共享性、互斥性、原子性、可见性、有序性)

时间:2019-11-06 10:29:41      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:关于   bsp   有一个   共享变量   有序性   程序   thread   指令   写入   

一、共享性

多个线程共享同一块内存,会引起线程安全问题。

例如变量A同时被Thread1和Thread2访问,可能发生Thread1和Thread2读取的变量A不是同一个值,大多数情况下Thread1和Thread2不会恰好同一个时间读取变量A,而变量A在这段时间差中可能已被修改。

二、互斥性

对同一个资源来讲,同一个时间只能有一个线程访问。解决了多个线程读取的资源不一致的情况,但是写操作要注意覆盖的问题。

三、原子性

对资源的操作一个完整的过程。不会再执行过程停下再做别的操作。所谓原子性指的是jvm实际执行中而非代码层面。

例如:i++不是原子性操作。

例如:ClassA  classA = new ClassA()。

使用synchronized可以保证原子性和互斥性。

四、可见性

针对共享变量而言,多个线程分别读取同一个共享变量时,将变量值写入独立的内存副本中,在未来的不确定时间与主内存同步,这将导致不同的线程对变量做了修改,而互相之间却不可见。

volatile关键字可以实现共享变量的可见。

五、有序性

可理解为程序是否按照代码编写的顺执行。

关于有序性从线程内和多个线程间两个角度考虑。

线程内时,程序看似是按照代码的编写顺序执行的,实际上不同的jvm都会对程序有不同程度的优化,指令具体的执行都是经过重新排序的。

 

线程间时,任何代码任何时间都有可能交叉执行。除非使用volatile、synchronized或者lock对程序进行控制。

总的来讲,程序串行执行肯定是因为使用了同步、互斥操作,要么就是纯属巧合。

 

 

线程执行的几种特性(共享性、互斥性、原子性、可见性、有序性)

标签:关于   bsp   有一个   共享变量   有序性   程序   thread   指令   写入   

原文地址:https://www.cnblogs.com/perfumeBear/p/11803504.html

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