jmm可以从两个方面理解,一是抽象内存结构,jmm把内存结构抽象成主内存和线程本地内存两种,在计算时,从主内存中加载数据,在本地内存计算,然后在刷新到主内存,但这种模型有明显的一致性问题,二是jmm可以理解我一组保住内存可见性及成正确性的规范,因为这种模型存在明显的一致性问题,同时,由于java编译器指令重排序优化和cpu乱序执行优化的存在,使问题变得更加复杂,所以jmm基于内存屏障提供了类似sa if serial以及happens before的保障。从使用者的角度理解,jmm平衡了jvm工程师以及cpu工程师在性能上的需求和java程序员在简单性上的渴望,所以jmm在保证正确性的同时会最大限度的放宽对指令重排和乱序执行的限制。对于java程序员,jmm提供了如volatile和synchronized这样的顶层机制为程序员提供简单的编程模型。(参考老师的文章及java并发编程艺术 理解)
之前的问题找到解决方法了,就是使用concurrenthashmap的computeIfAbsent方法,这个方法是加锁的. 文中提到的volatile的例子,我试了一下并没有复现出来,根据《深入理解JVM》这本书关于volatile的例子复现出来了,了解了volatile并不能保证字段线程安全 然后Brian Goetz的《java theory and practice:managing volatility》仔细拜读了一下,还是没有找到能够百分百复现出来的办法 请问有什么方法能够稳定复现出来文中的例子吗?