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)是否仍然可以访问原始对象?
谢谢,尼克
赋值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) { … }
| 归档时间: |
|
| 查看次数: |
207 次 |
| 最近记录: |