当前位置: 首页 > 面试题库 >

同步关键字会阻止Java中的重新排序吗?

唐照
2023-03-14
问题内容

假设我有以下Java代码

a = 5;
synchronized(lock){
    b = 5;
}
c = 5;

同步是否会阻止重新排序?a,b和c之间没有依赖关系。先分配给b然后再分配给c?如果我还没有同步,则可以用JVM选择的任何方式对语句重新排序?


问题答案:

同步是否会阻止重新排序?

它可以防止重新排序。您仍然可以在同步块外部和同步块内部进行重新排序,但不能从同步块内部对其进行重新排序。

a,b和c之间没有依赖关系。

没关系。

先分配给b然后再分配给c?

是。但是,如上所述,并非所有JVM都可以保证。(见下文)

如果我还没有同步,则可以用JVM选择的任何方式对语句重新排序?

是的,由JVM和/或CPU指令优化器和/或CPU高速缓存提供,但是由于没有明显的理由怀疑改变a = 5的顺序,因此不太可能。和b = 5; 将提高性能

您将看到的是缓存可见性的更改。即另一个读取这些值的线程可能会看到b = 5; 在a = 5之前; 例如,如果它们还没有同步,则它们位于不同的缓存行中。



 类似资料:
  • 本文向大家介绍Java中的同步关键字,包括了Java中的同步关键字的使用技巧和注意事项,需要的朋友参考一下 当我们在程序中启动两个或多个线程时,可能会出现多个线程尝试访问同一资源,最终由于并发问题,它们可能产生无法预料的结果的情况。例如,如果多个线程试图在同一文件中写入数据,则它们可能会破坏数据,因为其中一个线程可以覆盖数据,或者一个线程同时打开同一文件时,另一个线程可能正在关闭同一文件。 因此,

  • 问题内容: c#是否具有自己的java“ synchronized”关键字版本? 即在Java中,可以将其指定为函数,对象或代码块,如下所示: 要么 问题答案: 首先-大多数类将永远不需要是线程安全的。使用YAGNI:仅当你知道实际上将要使用它(并对其进行测试)时,才应用线程安全性。 对于方法级的东西,有: 这也可以用于访问器(属性和事件): 请注意,默认情况下,类似字段的事件是同步的,而自动实现

  • 这个问题以前可能已经回答过了,但是由于这个问题的复杂性,我需要一个确认。所以我重新措辞这个问题 问题1:当一个线程进入一个同步块时,内存屏障将包括被触摸的任何字段,而不仅仅是我同步的对象的字段?因此,如果在一个同步块中修改了许多对象,那么在线程内存缓存之间会有大量内存移动。 问题 2 : 在线程 1 中隐式地是“发生前”关系的一部分? 我希望是这样,但可能不是这样。如果没有,有没有一个技巧可以让它

  • 问题内容: 所以我正在用关键字测试。这是我尝试的示例: 当我运行它时,来自两个线程的调用方法的输出生成以下输出: 当我将方法更改为: 我得到以下输出: 尽管这使我清楚地了解的目的,但我想知道还有其他可以使用的原因。还是我在这里所做的,是为什么我们需要使用此关键字的唯一原因? 谢谢。 编辑: 令我感到困惑的另一件事是,在第一个输出中,为什么计数器在7之后变为3。这对我来说似乎有点不可能,但是每次尝试

  • 问题内容: Java 9最大的功能之一是Project Jigsaw定义的模块系统。当从JavaOne 2015 的Project Jigsaw:The Hood 中读取幻灯片时,我注意到以下源代码: 对我而言,有趣的是文件结尾,并且似乎使用了两个新关键字:和。Java 9将引入哪些其他关键字?向后兼容性(即名为的函数或变量)将如何处理? 问题答案: Java SE 9 Edition Java语

  • 问题内容: 这个问题是面向jQuery的,但不一定是排他的。 简短的问题: 同步ajax调用会阻止正常按钮被单击吗? 我的测试表明这没有发生,但也许其他浏览器出了问题。 长的问题: 在我询问的另一个问题中,如何阻止ajax调用(我希望它阻止),这些家伙说浏览器在某些情况下会阻止。 实际上,甚至jQuery 的文档都说: 我正在尝试: 1.了解发生这种情况的方式/原因。 2.评估发生这种情况的可能性