一、共享性
多个线程共享同一块内存,会引起线程安全问题。
例如变量A同时被Thread1和Thread2访问,可能发生Thread1和Thread2读取的变量A不是同一个值,大多数情况下Thread1和Thread2不会恰好同一个时间读取变量A,而变量A在这段时间差中可能已被修改。
二、互斥性
对同一个资源来讲,同一个时间只能有一个线程访问。解决了多个线程读取的资源不一致的情况,但是写操作要注意覆盖的问题。
三、原子性
对资源的操作一个完整的过程。不会再执行过程停下再做别的操作。所谓原子性指的是jvm实际执行中而非代码层面。
例如:i++不是原子性操作。
例如:ClassA classA = new ClassA()。
使用synchronized可以保证原子性和互斥性。
四、可见性
针对共享变量而言,多个线程分别读取同一个共享变量时,将变量值写入独立的内存副本中,在未来的不确定时间与主内存同步,这将导致不同的线程对变量做了修改,而互相之间却不可见。
volatile关键字可以实现共享变量的可见。
五、有序性
可理解为程序是否按照代码编写的顺执行。
关于有序性从线程内和多个线程间两个角度考虑。
线程内时,程序看似是按照代码的编写顺序执行的,实际上不同的jvm都会对程序有不同程度的优化,指令具体的执行都是经过重新排序的。
线程间时,任何代码任何时间都有可能交叉执行。除非使用volatile、synchronized或者lock对程序进行控制。
总的来讲,程序串行执行肯定是因为使用了同步、互斥操作,要么就是纯属巧合。
原文地址:https://www.cnblogs.com/perfumeBear/p/11803504.html
时间: 2024-11-17 04:18:42