采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
老师,我在这里看到unlock操作,在其构造方法的调用之前 这个是为什么,不应该里面的代码都执行完成才释放锁吗?
你看到的是那样的,实际上执行过程有指令重排序,对于单线程来讲是对开发者来说是透明的,多线程的话就不一定了。
例子里面虽然加了锁,但注意的是只有所有的线程都真正获取了这个锁才可以用锁来保证不重排序,咱们的例子里面两个线程一个加了锁,另一个直接判断了instance不为空(实际上是开辟了内存还没有初始化)就没有获取锁。这个是关键点。
那Thread1会将只开辟了内存却没有初始化的值写主内存吗?sychronized为啥不是它包着的那一块内容没有全部执行完就都放副本,全好了后再写主内存呢?这样的话Thread2即使在这时候去读主内存,就不会读到这种异常情况
哪有什么副本,只不过一般相对于内存来说会有cpu的缓存而已。既然是内存开辟,哪里还有写入一说呢。 同步的语义不是说我加锁,你就不用加。我加锁你不加锁跟都不加锁没啥区别。只有同时加锁才能保证同步块的原子性。
登录后可查看更多问答,登录/注册
改变视野和思维 深度与广度兼备的 Android 进阶面试指导课程
1.1k 1
1.2k 16
928 10
1.3k 10
1.2k 10