以下代碼執行,但我希望它列印一個與' 長度tmp相同長度的新字串。sample
class T10 {
static String tmp = "", sample = "Manipulate";
public static void main(String args[]) {
for(int i=0;i<sample.length();i )
new Thread10(i).t.start();
System.out.println(tmp);
}
}
class Thread10 implements Runnable {
int i;
Thread t;
Thread10(int i) {
t = new Thread(this, "Manipulator Thread : " i);
this.i = i;
}
public void run() {
T10.tmp =T10.sample.charAt(i);
}
}
以下是一些示例輸出:
Mnla
Maniplua
Mpia
Miap
Mu
uj5u.com熱心網友回復:
首先,你需要知道兩件事:
- 您不能在 Java 中更改字串。看起來像是在修改字串的代碼總是創建一個新字串并丟棄前一個字串
=不是單個操作 - 它是三個操作(讀取、修改、寫回)。
您可以想象在您的代碼中,當兩個執行緒同時讀取字串時,它們讀取的值相同(例如“Man”)。然后第一個執行緒創建一個新字串(添加它自己的字母,例如“Mani”),第二個執行緒創建另一個新字串(例如“Manp”)。現在他們都將對新值的參考放入欄位中tmp;根據哪個“獲勝”,其他執行緒永遠不會看到其中一個字符。請注意,在“真實”程式中,問題更為復雜(開始進行優化),您確實需要了解 Java 記憶體模型才能撰寫正確的代碼。
要解決您的問題,您需要:
停止使用字串(它們不能被修改,新的字串需要取代它們的位置),改用一個存盤字符的可變物件;所有執行緒都可以看到并可以寫入的單個物件;
確保該物件在與多個執行緒一起使用時“行為正確”(在 Java 中,這意味著該物件是并發的或同步的)
實際上,Java 有一個非常適合您的情況的非常古老的類(現在很少使用):StringBuffer。
使用 aStringBuffer而不是 aString為您的tmp; 然后使用append('x')而不是 = 'x'添加字符。
uj5u.com熱心網友回復:
請告訴我們您對代碼的期望輸出。
一般說來:
通過您的實作,您確實啟動了 10 個執行緒(因為您的sample字串有 10 個字母)。但是此時你完全無法控制執行緒的執行順序和tmp變數的狀態。
這可能會導致字母的混合順序和相互覆寫的字母(如您的輸出中所見)。
一旦您指定了您期望的輸出,就可以提出解決方案。
uj5u.com熱心網友回復:
除了上面的正確答案:另一個問題是您需要一個通用鎖來同步所有執行緒。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/435904.html
