PDF 课件和源代码下载地址:
https://gitee.com/geektime-geekbang/LetsJava
作者回复: 应该这么理解,使用volatile关键字强制从主存获取数据而不是从CPU缓存中获取,就会抑制指令重排优化。 为什么抑制指令重排优化?因为优化器觉得这种情况下再优化,会导致程序运行不准确。 为什么这时候优化会造成程序运行不准确?我们这里的例子就是展示的指令重排造成代码运行“不准确”。 我们使用volatile关键字,就是告诉编译器我关系这里的顺序和数据的一致性,这时候编译器就不优化/重排了。
作者回复: 对应到现代CPU的结构,应该是每个线程都会访问主存,而不会仅仅访问CPU寄存器。 简单来说,你想起一件事情,在脑子里(CPU寄存器)说我回头有空要把这个事情记在公告板(内存)里。而volatile的意思是,想起来这个事情,立刻马上跑到公告板把事情写上。
作者回复: 多线程需要准确的得到某个变量的值的时候。
作者回复: 应该不会,单次的写应该是原子性的,对应到CPU的一个指令。如果这个都不能保证的话就乱套了。 比如说,两个线程向同一个堆上的变量a写数据,一个写0x123456789,一个写0x987654321。 那么这个变量a的值要么是0x123456789要么是0x987654321。不可能是0x123456321,或者0x983456789,或者0x183654389
作者回复: int 和 long 都加上试试看。
作者回复: 嗯那,参见视频三分二十秒的解释。
作者回复: volatile不让指令重排,而且还会强制cache失效,让数据和主存同步。利用这个特性,可以实现锁的功能。之所以叫轻量级的锁,是因为这个锁的开销比较小,但是同样的,实现锁的功能也要自己写不少代码
作者回复: 同步的东西都有点绕脑子
作者回复: volatile要操作主存,不能用cpu的高速缓存,所以更慢。