原子性、 可见性、有序性

/ 多线程 / 没有评论 / 335浏览

在其它文章中我们介绍了Java内存模型也就是JMM,在这一篇中我们主要来分享一下在JMM中是怎么保证线程的原子性、 可见性、有序性的。首先我们还是看一下它们相关的概念。

在JMM中是通过8种操作来实现线程的原子性的。也可以认为是在Java中基本的数据类型在访问读写时是具备原子性的,但也有一些例外,就是long类型和double类型是非原子性的。如果我们想在在一个方法上保证线程的原子性那么我们就要采用synchronized关键字了。synchronized关键字在底层的实现逻辑是通过指令monitorentermonitorexit来实现的。所以在关键字synchronized之间的操作也是具备原子性的。

可见性是指如果线程修改了共享变量的值,其它线程可以立即知道修改后的值。它的实现原理是如果线程修改了volatile变量,那么可以保证volatile变量会立即同步到主内存中。如果其它线程在获取volatile变量时,只能从主内存中获取,而不能从自己线程的工作内存中获取。

有序性是指如果在本线程内观察程序执行,那么它会是是有序的。如果在线程与线程间观察程序的运行,那么它就是无序的。 在Java中主要采用关键字volatile和关键字synchronized来保证线程之间的有序性。它们的区别是volatile关键字是禁止指令的重排序实现的。而关键字synchronized则是规定获得同一个锁的synchronized同步块只能串行的执行。