网上有人说是因为指令重排序
锁{ 1. 申请内存 2. 初始化为一个 Object 3. 将指针指向 Object }
但是执行是按照 1 3 2 执行的 造成没初始化完毕线程 2 进入 syn 锁内, 然后判断 null 成功, 又初始化了一个对象
但是我理解即使是按照 1 3 2 执行的,JVM 不也应该执行完全部代码才能释放 syn 吗?也就是说,2 过程没执行完毕呢这个锁也不可能被释放掉啊。
我个人感觉是因为 第一次检查的时候, 线程 2 缓存了这个对象, 然后因为没加 volatile, 第二次判断是否为 null 仍然是从其 CPU 缓存里面检查的, 加 volatile 是为了保证其每次都重新去内存里面取一下然后做判断。
麻烦大神解答一下,小弟感激不尽
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.