java基础之volatile关键字 volatile关键字主要解决什么问题
转眼又到圣诞节
加班完成去逛街
问问老婆开心不
没备礼物被打瘸
-----------------------------------打油诗专用分割线--------------------------------
Volatile
Java语言的关键字,用来声明变量,表示这个变量是被同时运行的几个线程修改的,需要保证变量的可见性并禁止指令重排序。
可见性的含义:
可见性的意思是指当一个线程修改一个共享变量时,另外一个线程能读到这个修改后的值,volatile作用就是当一个线程修改了共享变量的值,其他线程马上就能知道。
Java内存模型规定所有的变量都是存在主存当中,每个线程都有自己的工作内存。线程对变量的所有操作都必须在工作内存中进行,而不能直接对主存进行操作。并且每个线程不能访问其他线程的工作内存
那么Volatile是如何来保证可见性的呢?
在x86处理器下通过工具生成的汇编指令来看看对Volatile进行写操作时,CPU会做什么事儿:
Java代码:
instance = new Singleton();//其中instance是volatile修饰的变量
汇编代码:
0x01a3de1d: movb $0×0,0×1104800(%esi);
0x01a3de24: lock addl $0×0,(%esp);
lock前缀指令实际上相当于一个内存屏障,会提供3个功能:
1.它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成;
2.它会强制将对缓存的修改操作立即写入主存;
3.如果是写操作,它会导致其他CPU中对应的缓存行无效。
处理器为了提高处理速度,不直接和内存进行通讯,而是先将系统内存的数据读到内部缓存,后再进行操作,但操作完之后不知道何时会写到内存,如下图1所示:
图1