gpt4 book ai didi

java - 由其他线程更新的对象仅对另一个线程部分可见

转载 作者:行者123 更新时间:2023-12-03 13:14:47 25 4
gpt4 key购买 nike

我正在做多线程编程,遇到一个有线问题:对象更新对于另一个线程仅部分可见。这是伪代码:

初始状态:线程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中,有时字符串c.s的值实际上为空。但我希望它具有“成功”的值(value)。另一方面,如果我将Thread.sleep(sometime)放在assert语句之前,那么我可以看到c.s的期望值。我不知道为什么会这样。

我试图将字段变量s声明为volatile,但这无济于事。

谢谢!

更新
感谢您的所有答复/回答。经过更多的实验和研究,我相信这是我正在使用的框架的错误。该框架管理线程的挂起/恢复,并且在有许多并发请求/连接(例如10k线程)时会陷入困惑。

最佳答案

您需要在线程A和B之间进行一些同步。

线程A:

c.i = 10;
c.s = "success";
c.notify()

线程B:
c.wait()
assert(c.i == 10);
assert(c.s.equals("success"));

如果没有这种同步(或类似的功能,例如 synchronized块),则不能保证写入操作使它从一个线程到另一个线程(完全或以任何特定顺序)。

关于java - 由其他线程更新的对象仅对另一个线程部分可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13081147/

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