为什么synchronized不能禁止重排指令,但能保证有序性?
据说读者面前的很多问题都还可以,属于那种可过可过的类型。面试官最后一个问题是,如果他对答案满意,他可以给offer,如果答案不好,他就不会让它过去。
那么这个问题应该怎么回答呢?
首先,我们应该分析这个问题,我们不得不说面试官仍然有一定的水平,这个简单的问题,事实上,它仍然包含很多信息,为了回答这个问题,面试官至少应该知道这个概念:
Java内存模型、并发编程有序性问题、指令重排、synchronized锁定、可重入锁、排他锁、as-if-serial语义,单线程&多线程
那么,正确回答这个问题的姿势是什么呢?
标准答案如下:
这是个好问题。我也想过这个问题,查阅了很多资料,甚至查阅了hotsopt的源代码。 不管三七二十一,上来舔一波,然后表现出求知好学的态度。
为了进一步提高计算机各方面的能力,在处理器优化、指令重排等硬件层面进行了大量的优化,但这些技术的引入会导致有序性问题。 先告诉面试官你知道什么是有序问题,什么是有序问题
我们也知道,解决有序问题的最好方法是禁止处理器优化和重新排列指令,就像在volatile中使用内存屏障一样。 这表明你知道什么是指令重排和他的实现原则
然而,尽管许多硬件会重新排列优化,但在Java中,无论如何排序,都不会影响单线程序的执行结果。这就是as-if-serial语义,所有硬件优化的前提是必须遵守as-if-serial语义。 重点!解释什么是as?-if-serial语义,因为这是这个问题的第一个关键词,答案是对的一半
除了synchronized,他是Java提供的锁,可以通过他锁定Java中的对象,而且他是排他性的,可以重新进入的锁。 安装X项,不留痕迹,展示自己对锁了解更多
因此,当一个线程执行到一个由synchronized修改的代码时,它将被锁定,然后在执行后解锁。在锁定和解锁之前,其他线程不能再锁定,只有锁定线程才能重复锁定。 本题的第二个关键点是介绍synchronized的原理,到这里基本可以拿满分。
synchronized通过排他锁保证了synchronized同时修改的代码是单线程执行的。因此,这满足了as-if-serial语义的一个关键前提是单线程,因为有as-if-serial语义保证,单线程的有序性自然存在。