看的是jvm典中典《深入理解Java虚拟机》。说的volatile能保证可见性,但不能保证原子性。可见性我能理解,被volatile修饰的变量一旦在其中一个工作内存中被修改,那么其他工作空间对应的变量就失效了,当其他线程想使用这个变量却发现其已经失效后就会重新到主内存里去读取。
但我无法理解为啥不能保证原子性:现在主内存有变量i初始值为0,有2个线程A,B去调用它都想分别i++,假设线程A读取到i后,暂时搁置了,线程B读取到i后,将i值加1,再写回主内存,那么等A回过神来时,书上说的是A会将它原本读到的i加1然后写回主内存,这样主内存里i最终结果就为1而不是2,没能保证原子性。我想问的是当B修改i之后,A不应该发现自己工作空间的i已经失效了吗,A为什么不重新读取主内存已经被B修改过的i然后再进行i++,反而要固执地用最初的i值去i++?
但我无法理解为啥不能保证原子性:现在主内存有变量i初始值为0,有2个线程A,B去调用它都想分别i++,假设线程A读取到i后,暂时搁置了,线程B读取到i后,将i值加1,再写回主内存,那么等A回过神来时,书上说的是A会将它原本读到的i加1然后写回主内存,这样主内存里i最终结果就为1而不是2,没能保证原子性。我想问的是当B修改i之后,A不应该发现自己工作空间的i已经失效了吗,A为什么不重新读取主内存已经被B修改过的i然后再进行i++,反而要固执地用最初的i值去i++?
陆道然


炎焱燚









