gpt4 book ai didi

java - Java 编译器是否优化了空的同步块(synchronized block)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:49:05 24 4
gpt4 key购买 nike

假设我在代码的某处写了一个空的 synchronized block :

synchronized(obj){
//No code here
}

因此,由于同步块(synchronized block)不包含任何代码,JIT 编译器是否会通过不锁定 obj 来优化它,因为它没有用?

Java 编译器会做一些类似的技巧,例如 Lock coarsening,但是这个同步块(synchronized block)是否也会被优化掉?

编辑:

根据 assylias 的观点,

synchronized(new Object()){
//empty block
}

JIT 编译器现在是否能够优化它,因为我使用的对象不会转义我的方法?

最佳答案

这不能基于 Java 内存模型语义进行优化。锁获取-释放操作可能被其他东西取代,但即使是空的synchronized block 也会影响其他线程获取相同锁所采取的操作的可见性。

具体来说,可以保证一个线程在释放锁之前完成的所有写操作对另一个线程在获得相同锁后可见

关于您的编辑

这是一个非常不同的情况:在一个对象上获得了一个锁,可以通过逃逸分析证明没有其他线程能够获取它。在这种情况下,synchronized block 的内容是什么并不重要:重点仅在所使用的锁中。代码可以看起来像您发布的那样,甚至可以像这样:

Object o = new Object();
synchronized(o) {
// any operations you like, as long as they don't let o escape the method scope
}

这可以通过称为锁省略 的转换来实现:JVM 可以假装它从未见过同步 block 。这是因为 JMM 语义仅指获取同一个锁的情况。

关于java - Java 编译器是否优化了空的同步块(synchronized block)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18056111/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com