请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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

正在回答 回答被采纳积分+3

1回答

bennyhuo 2019-12-09 14:24:52

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

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

0 回复 有任何疑惑可以回复我~
  • 那Thread1会将只开辟了内存却没有初始化的值写主内存吗?sychronized为啥不是它包着的那一块内容没有全部执行完就都放副本,全好了后再写主内存呢?这样的话Thread2即使在这时候去读主内存,就不会读到这种异常情况
    回复 有任何疑惑可以回复我~ 2020-09-01 13:08:34
  • 哪有什么副本,只不过一般相对于内存来说会有cpu的缓存而已。既然是内存开辟,哪里还有写入一说呢。
    
    同步的语义不是说我加锁,你就不用加。我加锁你不加锁跟都不加锁没啥区别。只有同时加锁才能保证同步块的原子性。
    回复 有任何疑惑可以回复我~ 2020-09-01 16:03:56
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信