原子性:即一个操作或者多个操作,要么全部执行,并且执行的过程不会被任何因素打断,要么就都不执行。(注意单核与多核,CPU时间片耗尽,打断与影响)
在单CPU的情况下,只要一组操作能在一个时间片内被完成,这组操作就是原子性的,如果完不成,可能在这个空档期会有别的线程操作这组操作中的变量,破坏原子性。
在多CPU的情况下,无论一组操作否能在一个时间片内被完成,都有可能会有别的线程操作这组操作中的变量,破坏原子性。
原子操作:满足原子性的操作,在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执行。
example:
x = 10; //语句1 y = x; //语句2 x++; //语句3 x = x + 1; //语句4
只有语句1是原子性操作,也就是说,只有单步的读取、赋值(而且必须是将数字赋值给某个变量,变量之间的相互赋值不是原子操作)才是原子操作。
原子操作问题 : 线程中 , 对变量副本 count 进行自增操作 , 不是原子操作 , 首先 从工作内存中读取变量副本到执行引擎 ( 操作数栈 ) 中
, 然后 再 进行自增运算 , 最后 写回到线程工作内存中 , 这是3个操作 , 如果变量 在这3个操作的空档时间进行了修改 , 那么就会产生无法预知的效果 ;