Java布尔对象中的值赋值是否会导致在内存中重新分配

nic*_*sip 3 java multithreading

我有以下代码

Boolean flag = new Boolean(false);
flag = true;
Run Code Online (Sandbox Code Playgroud)

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

在我的应用程序中,有多个线程被赋予对前一个Boolean对象的引用.只有一个线程将对象值更改为true,其余线程等待对象的值变为true.因此,如果T1是更改值的线程,则其代码如下:

synchronized(flag) {
    flag = true;
    flag.notifyAll();
}
Run Code Online (Sandbox Code Playgroud)

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

synchronized(flag) {
    while(flag == false)
        wait();
    if(flag == true) {
        //do something
    }
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢,尼克

Hol*_*ger 6

赋值flag = false拳击转换.它将被编译为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();
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,声明实例方法synchronized与包装其代码类似synchronized(this) { … }