我有一个函数可以启动几个线程(它是一个测试函数),其中一个线程会改变变量的状态。由于局部变量不能标记为 volatile ,因此我假设该方法中的多个线程将始终具有变量的更新状态。它是否正确?这是示例代码
public void someMethod() {
MutableBoolean mb = new MutableBoolean(false);
Thread t1 = new Thread() {
public void run() {
while (someCondition) {
if ( mb.getValue() ) {
...do something
}
}
}
}
t1.start();
Thread t2 = new Thread() {
public void run() {
if ( someCondition ) {
mb.setValue(true);
}
}
}
t2.start();
...wait for the threads to complete
}
最佳答案
除非 MutableBoolean 在其设置/获取值方法中使用锁,或者它是原子操作,否则这不是线程安全的。
getValue 可以在 setValue 更新值时读取该值。您可能会使用 boolean 值来解决此问题,但对于任何更复杂的类型,它可能会失败。
对共享状态的访问加锁以使其线程安全。
关于java - 函数内的多线程变量访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1958461/