gpt4 book ai didi

如果更改,Java 会同步阻塞吗?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:37:20 24 4
gpt4 key购买 nike

private Object x = new Object();

public void doA() {
synchronized(x){
x = new Object();
//do something
}
}

public void doB() {
synchronized(x) {
//do something
}
}

假设 doA()doB() 被同时调用,但 doA() 先进行。所以 B 将被阻塞,直到 doA() 完成

即使 doA()x = new x 调用中修改了 x,这是否正确?或者在 doA() doB() 这一行 x = new x 之后将不再被阻塞,因为 x已经改变?

最佳答案

实际发生的情况取决于 doA() 的运行速度:

如果 doA()doB() 到达其同步块(synchronized block)之前更改了 x 的值,则 doB() 将锁定 doA() 创建的 对象。

如果 doB() 很快并且 synchronized(x) 部分在 doA() 可以改变 的值之前得到评估>x,然后 doB() 将不得不等到 doA()synchronized block 完成。

说明

每当 Java 在任一方法中到达 synchronized(x) 代码时,它都会计算变量 x,并且该变量会为 Java 提供一个对象。因此,Java 然后会尝试锁定该对象,并一直锁定在该对象上。或者,如果该对象上已经有锁,它将等待锁消失。 (每当 Java 到达 synchronized(x) 代码时,它会获取变量的值并忽略变量本身,因此您可以在之后随心所欲地更改变量,但锁定和锁定检查仍然发生在变量的先前值上。)

关于如果更改,Java 会同步阻塞吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56281291/

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