私は私が期待どおりに動作しない同期化の問題を抱えているが、私はまた、揮発性のキーワードを使用してみました:Javaの同期問題
共有オブジェクト:
public class ThreadValue {
private String caller;
private String value;
public ThreadValue(String caller, String value) {
this.value = value;
this.caller = caller;
}
public synchronized String getValue() {
return this.caller + " " + this.value;
}
public synchronized void setValue(String caller, String value) {
this.caller = caller;
this.value = value;
}
}
スレッド1:
class CongoThread implements Runnable {
private ThreadValue v;
public CongoThread(ThreadValue v) {
this.v = v;
}
public void run() {
for (int i = 0; i 10; i++) {
v.setValue("congo", "cool");
v.getValue();
}
}
}
を
スレッド2:
class LibyaThread implements Runnable {
private ThreadValue v;
public LibyaThread(ThreadValue v) {
this.v = v;
}
public void run() {
for (int i = 0; i 10; i++) {
v.setValue("libya", "awesome");
System.out.println("In Libya Thread " + v.getValue());
}
}
}
クラスを呼び出す:
class TwoThreadsTest {
public static void main (String args[]) {
ThreadValue v = new ThreadValue("", "");
Thread congo = new Thread(new CongoThread(v));
Thread libya = new Thread(new LibyaThread(v));
libya.start();
congo.start();
}
}
時折私が手決して起こらないはずです を「リビアスレッドコンゴクール」。私はただ期待しています: "リビアでスレッドlibya素晴らしい" "コンゴのスレッドコンゴで"
私はそれらが混在することを期待していません。
、あなたはおそらく同期のも、このレベルを非表示にします。それ自体が同期するsetValueAndReturnString()のようなメソッドを持っています。マルチスレッドを正しく処理する呼び出し側に頼ることは望ましくありません。 – AngerClown
合意。私は彼が求めていた振る舞いを達成するはずのコードバージョンをMoに提供することで、他のユーザーから提供されたレスポンスとともに、何が間違っているのか理解し、同期の仕組みを理解するのに役立ちます。 –