00:00
好,各位同学,接下来给大家说一下。多线程对变量的读写过程和我们前面的可见性前后呼应,来再来看一下。首先我们先来看一下这张图。OK,那么。主内存,也就是我们日常所说的物理内存条,你去京东上买一条内存条就是它,那么变量共享变量。有且仅有一份存在,这儿前面说过了。线程A和线程B不可以去动。主内存的共享变量。第二个,他们两个之间不可以互相通信,不可以去改对方的,那么比如说我去动这个主内存的共享变量,我把值从五改为六了,那么我想通知B,那么B也只能从五从这个主。内存当中读取最新的数据到自己库里面再去修改,哎,他们两个有这么个关系,横向不打通,竖向只能访问共享内存。
01:01
主内存好,那么这一切是由谁来控制的呢?那么在这儿有个总线的。嗅探机制和我们的SI缓存一致性协议,这个呢,牵扯到一些底层的操作系统,我们就不再过多的展开,那么请注意,就是说有这样一种东西来保证了所有的总线嗅探机制啊,那么只要有人改了动了,我马上就会通知其他线程主内存有最新的,请来取最新的版本,而这一切都落实在GM规范。那么来吧,同学们。我们呢,它的运行呢是什么?Java虚拟机运行一个程序,是一个线程。那么我们是不是说过卖主线程对吧,一切程序的入口。他每个现在创建的时候,都会为其创建一个工作的内存。OK,有些地方称之为占空间。那么工作内存是每个线程是吗?私有的数据区域,而Java内存模型中规定的所有变量。
02:02
都存储在什么地方?主内存,那么这个时候这块是一块共享的,所有线程是都可以访问的public。当线程对变量的操作。读。和赋值。必须在工作内存中进行。所以说他首先要将变量从主内存前面强调过拷贝一份到自己的什么现成的自己的工作内存空间,然后对变量进行操作,操作完了以后再将变量怎么着。写回主内存。而不能够直接操作主内存中的变量,所以说各个线程中的工作内存中存储着主内存中的什么变量的副本拷贝,因此不同的线程间无法访问对方的工作内存。他们之间的传值啊,必须通过主内存来搞定,那么访问的就是这张图,那么这一切都是靠GM结合这两个来。
03:06
落地和保障。那么最终我们呢,叫。清楚GMM定义了现场和主内存之间抽象的内存模型访问。那么第一个。线程之间的共享变量存储在主内存中,有且仅有一份。大家。干嘛不可以直接在这儿操刀,直接是什么?要读取到自己的。本地内存里面修改完了你再写回来,OK。第二个,每个线程都有一个私有的工作的本地内存空间,那么存储了这个变量副本整完了再写回去,好,那么这个就是什么。多线程对变量的读写过程,那么我们把上面呢做个小小的总结来。所有共享变量都存储在物理内存中。每个线程都有自己独立的工作内存,里面保存该线程使用到的变量副本,OK,主内存中该变量的一份拷贝,把主内存中的这份共享到拷贝到自己这儿,完了以后呢?
04:09
他的所有操作都必须在线成自己的工作内存中。进行后再写回主内存,你不能直接从主内存中去写。不能越级,OK。最后。我们之间不可以直接访问其他线程的工作内存中的变量,那是私有欲听懂。所以说他们之间要访问,要传值,必须要通过主内存来进行,一句话,线程什么同级之间不可以相互访问,好,那么给我听,这个就是多线程对变量的读写过程。
我来说两句