课程
/后端开发
/Java
/细说Java多线程之内存可见性
共享变量和volatile变量区别
2018-08-12
源自:细说Java多线程之内存可见性 4-1
正在回答
共享变量是对于多线程而言的,多个线程访问同一个变量,需要先把他从主内存拷贝到自己的工作内存中,读写的操作都是在工作内存与主内存之间进行的,工作内存与工作内存之间无法交互。volatile是为了保证线程A对于共享变量的修改,对其他线程B线程C是立即可见的。对于这一点,volatile符合两个规则:1.线程A在修改共享变量后将其同步到主内存中 2.线程BC在使用这个共享变量前,先从主内存刷新得到最新的值。所以很神奇,volatile变量在使用时总是能拿到最新的值。
共享变量是在多线程操作的情况下,对某一个变量都有进行操作,该变量存储在主存中,但是在多线程的工作内存中都有一个副本,所以该变量是共享的,即为共享变量。 volatile变量是被该关键字修饰的变量。在单线程中也可以用来修饰变量,但是没有意义。用在多线程中,是为了保证被其修饰的变量对于多线程来说都是内存可见的。 在多线程中,volatile用来修饰共享变量,实现共享变量的可见性。
我理解的是其实这个两种类型的变量在主内存中是一样的,只是在多线程的情况下,volatile修饰变量在线程操作前,会执行store和load方法,这样把主内存中的变量同步到了工作内存中。我自己的理解,不知道对不对。
举报
用两种方式实现内存可见性,代领大家深层次学习Java中的内存
2 回答论静态变量与 volatile和synchronized的区别
3 回答为什么共享变量的可见性一定是private
1 回答加入有5个线程,某个变量在其中三个线程中有用到。这个变量算不算共享变量呢?
2 回答java多线程中共享变量是不是一定要private修饰?
1 回答为什么两个volatile变量在不变式中就会使得volatile线程不安全?