原子性、可见性、有序性

原子性:由JMM直接保证的原子性变量操作是read、load、assign、use、store和write,大致可以认为基本数据类型的读写都是原子性的操作(大多数商用虚拟机将long和double的读写作为原子性操作来对待),对于更大范围的原子性保证,JMM提供了monitorenter和monitorexit操作,对应Java代码中就是synchronized关键字。

可见性:可见性是指当一个线程修改了共享变量的值,其他线程能立即得知这个修改。JMM是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值这种依赖主内存作为传递媒介的方式实现可见性的,无论是普通变量还是volatile变量都是如此,不同的是volatile变量的特殊规则保证了新值能够立即同步到主内存,以及每次使用变量值前立即从主内存刷新变量的数据。

除volatile外,还有synchronized和final可以实现可见性。

final的可见性是指被final修饰的字段在构造器中一旦完成初始化,并且构造器没有把“this”的引用传递出去(this引用逃逸是一件很危险的事,其他线程可能通过这个引用访问到“初始化一半”的对象),那在其他线程中就可以看到final字段的值。

有序性:如果在本线程内观察,所有的操作都是有序的,这是因为线程内表现串行的语义;如果在一个线程中观察另一个线程,所有的操作都是无序的,这是因为“指令重排”和“工作内存与主内存同步延迟”。

《深入理解Java虚拟机》

猜你喜欢

转载自blog.csdn.net/Wengzhengcun/article/details/83590053
今日推荐