我正在進行多線程編程並遇到有線問題:對象更新只對另一個線程部分可見。下面是僞代碼:由不同線程更新的對象僅對另一個線程部分可見
初始狀態:線程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的值實際上是null。但我期望它具有「成功」的價值。另一方面,如果我在斷言語句之前放置了Thread.sleep(有時),那麼我可以看到c.s的期望值。我不知道爲什麼會發生。
我試圖將提交的變量s聲明爲volatile,但它沒有幫助。
謝謝!
更新 感謝所有答覆/答案。經過更多的實驗和調查後,我認爲這是我正在使用的框架的一個錯誤。該框架管理線程的掛起/恢復,並且當有許多併發請求/連接(如10k線程)時,它會變得雜亂無章。
你能顯示實際的代碼嗎?因爲多線程不能以你應該的方式工作。即使在線程A完成工作之前,線程B也可以開始工作。 –
揮發性物質應該起作用。您是否將String標記爲volatile或整個c對象爲volatile? –
你用什麼機制來喚醒線程B部分? – Tudor