synchronized包裹的内容为什么能初始化一半就被其他线程读到

来源:4-2 如何写出线程安全的程序?

she_says

2020-09-01

前面有两个人问过了,你的解释是Thread1中Singleton实例被分配了内存,但还未被初始化,这时候Thread2判断非null,直接获取未被初始化的实例。
那为什么会出现这种情况呢?synchronized内实例还没初始化就写了主内存,我怎么感觉这时还在副本,别的线程也读不到这种情况吧?那Thread1实例分配内存写一次主内存,被Thread2读到了,Thead1实例初始化完成再写一次主内存?
图片描述

写回答

1回答

bennyhuo

2020-09-01

开辟内存就是在内存中划分空间,所以不存在同步块结束以前开辟内存就是在写副本的问题。
0
2
she_says
粘贴一下答案 she says 那还有把这块new出来的内存地址值赋值给singleton变量不用先写缓存再写内存,就是直接赋给内存吧? @she says 其实写缓存不是必须的,但写不写取决于机器,Java规范没有对这个做要求。如果写,那就存在可见性问题,如果直接到内存,那其他线程就能看到未完全初始化的实例了
2020-09-18
共2条回复

大厂资深面试官 带你破解Android高级面试

改变视野和思维 深度与广度兼备的 Android 进阶面试指导课程

1643 学习 · 222 问题

查看课程