volatile 的学习要点

来源:互联网 发布:c 编程 猜字小游戏 编辑:程序博客网 时间:2024/05/22 06:30


第一个重点:要了解,多线程之间的通信机制有两种,共享内存和消息传递。另外除了主存之外,每一个线程都有一个私有的本地内存空间(Local memory)。本地内存中存储了该线程以读/写共享变量的副本。其实本地内存是JMM的一个抽象概念,并不真实存在,它涵盖了缓存,写缓存区,寄存器以及其他的硬件和编译器的优化。


JAVA内存模型线程通信机制

第二个重点:重排序的问题。

在执行程序的时候,为了提高性能,编译器和处理器常常会对指令做重排序,重排序分为3种。

1:编译器优化的重排序。

2:指令集并行重排序。

3:内存系统的重排序。


最后,对volatile进行介绍,它具有以下特性。

1)可见性。对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入。

2)原子性。对任意单个volatile变量的读/写具有原子性,但类似于volatile++这种复合操作不具有原子性。

3)根据之前所说的通信机制,volatile是通过清除第二个线程中已有的本地内存中的变量信息为无效,使得线程B不得不去主线程去获取共享变量以得完成变量的可见性。

4)volatile修饰的变量的读、写都会在每一次读写前会加入屏障,来禁止程序的重新排序。


0 0
原创粉丝点击