synchronized修饰的代码块的锁是何时释放的?

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

ValarRay

2019-12-09

老师,我在这里看到unlock操作,在其构造方法的调用之前
这个是为什么,不应该里面的代码都执行完成才释放锁吗?
图片描述

写回答

1回答

bennyhuo

2019-12-09

你看到的是那样的,实际上执行过程有指令重排序,对于单线程来讲是对开发者来说是透明的,多线程的话就不一定了。

例子里面虽然加了锁,但注意的是只有所有的线程都真正获取了这个锁才可以用锁来保证不重排序,咱们的例子里面两个线程一个加了锁,另一个直接判断了instance不为空(实际上是开辟了内存还没有初始化)就没有获取锁。这个是关键点。

0
2
bennyhuo
哪有什么副本,只不过一般相对于内存来说会有cpu的缓存而已。既然是内存开辟,哪里还有写入一说呢。 同步的语义不是说我加锁,你就不用加。我加锁你不加锁跟都不加锁没啥区别。只有同时加锁才能保证同步块的原子性。
2020-09-01
共2条回复

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

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

1636 学习 · 222 问题

查看课程