gpt4 book ai didi

java - Java Boolean对象中的值赋值会导致内存重新分配吗

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:55:01 25 4
gpt4 key购买 nike

我有如下一段代码

Boolean flag = new Boolean(false);
flag = true;

第二行(赋值)会导致在 JVM 中重新创建初始对象(基本上是对 new() 的调用)吗?我问是因为我正在使用一个 boolean 对象来同步多个线程,而且我担心如果发生重新初始化,等待线程将看不到值的变化。

在我的应用程序中,有多个线程被赋予对前一个 boolean 对象的引用。只有一个线程将对象值更改为真,其余线程等待对象值变为真。所以,如果T1是改变值的线程,它的代码是这样的:

synchronized(flag) {
flag = true;
flag.notifyAll();
}

其余线程 (T2) 的代码如下:

synchronized(flag) {
while(flag == false)
wait();
if(flag == true) {
//do something
}
}

因此,问题是在将 true 赋值给 flag 之后,其他线程(T2)是否仍然可以访问原始对象?

谢谢,尼克

最佳答案

作业 flag = falseboxing conversion .它将被编译为 flag=Boolean.valueOf(false) 这将最终返回常量 Boolean.FALSE .

所以答案是,它不会创建新对象,但会更改变量 flag因为它分配的实例与您之前的 new Boolean(false) 结果不同.

不太清楚您实际在做什么,但总的来说,对可变变量进行同步是错误的设计。


问题是您混合了构成条件的值和要同步的对象。更新意图的最简单实现是使用简单的 boolean标记并在包含标记的实例上同步:

class WithFlag {
private boolean flag;

public synchronized void setToTrue() {
if(!flag) {
flag=true;
notifyAll();
}
}
public synchronized void waitForTrue() throws InterruptedException {
while(!flag) wait();
}
}

注意声明一个实例方法synchronized类似于用 synchronized(this) { … } 包装它的代码

关于java - Java Boolean对象中的值赋值会导致内存重新分配吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29037122/

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