Thread --三大特性 原子性,可见性,有序性

原子性、可见性有序java

什么是原子性

即一个操做或者多个操做 要么所有执行而且执行的过程不会被任何因素打断,要么就都不执行。编程

一个很经典的例子就是银行帐户转帐问题:
好比从帐户A向帐户B转1000元,那么必然包括2个操做:从帐户A减去1000元,往帐户B加上1000元。这2个操做必需要具有原子性才能保证不出现一些意外的问题。安全

咱们操做数据也是如此,好比i = i+1;其中就包括,读取i的值,计算i,写入i。这行代码在Java中是不具有原子性的,则多线程运行确定会出问题,因此也须要咱们使用同步和lock这些东西来确保这个特性了。 多线程

原子性其实就是保证数据一致、线程安全一部分,优化

什么可见性

当多个线程访问同一个变量时,一个线程修改了这个变量的值,其余线程可以当即看获得修改的值。spa

若两个线程在不一样的cpu,那么线程1改变了i的值还没刷新到主存,线程2又使用了i,那么这个i值确定仍是以前的,线程1对变量的修改线程没看到这就是可见性问题。 .net

什么是有序性

程序执行的顺序按照代码的前后顺序执行。线程

通常来讲处理器为了提升程序运行效率,可能会对输入代码进行优化,它不保证程序中各个语句的执行前后顺序同代码中的顺序一致,可是它会保证程序最终执行结果和代码顺序执行的结果是一致的。以下:排序

int a = 10;    //语句1get

int r = 2;    //语句2

a = a + 3;    //语句3

r = a*a;     //语句4

则由于重排序,他还可能执行顺序为 2-1-3-4,1-3-2-4
但毫不可能 2-1-4-3,由于这打破了依赖关系。
显然重排序对单线程运行是不会有任何问题,而多线程就不必定了,因此咱们在多线程编程时就得考虑这个问题了。

相关文章
相关标签/搜索