我正在做多线程编程并遇到一个有线问题:对象更新对另一个线程仅部分可见。这是伪代码:
初始状态:线程A运行,线程B阻塞
Class C {
public int i;
public String s;
}
线程 A:
...
// c is an object of class C and is accessible by both thread A and B
c.i = 10;
c.s = "success";
wakeup thread B:
线程 B:
// after wakeup
assert(c.i == 10);
assert(c.s.equals("success"));
问题是:在线程 B 中,有时字符串 cs 的值实际上为空。但我希望它具有“成功”的价值。另一方面,如果我将 Thread.sleep(sometime) 放在断言语句之前,那么我可以看到 cs 的预期值,我不知道它为什么会发生。
我试图将归档变量 s 声明为 volatile,但它没有帮助。
谢谢!
更新 感谢所有回复/答案。经过更多的实验和调查,我相信这是我正在使用的框架的一个错误。该框架管理线程的挂起/恢复,当有许多并发请求/连接(如 10k 个线程)时,它会陷入混乱。