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

一、共享性

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

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

二、互斥性

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

三、原子性

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

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

例如:ClassA  classA = new ClassA()。

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

四、可见性

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

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

五、有序性

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

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

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

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

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

猜你喜欢

转载自www.cnblogs.com/perfumeBear/p/11803504.html