我在与同步行为不我所期望的方式问题,我使用volatile关键字尝试也:的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();
}
}
偶尔我得到“在利比亚主题刚果酷” 这绝不应该发生。我只希望: “在利比亚线程利比亚真棒” “在刚果线程刚果酷”
我不指望他们混合。
在一个不平凡的程序,你可能想隐瞒甚至这个水平同步。有一个像setValueAndReturnString()它自己同步的方法。你不想依赖调用者正确处理多线程。 – AngerClown 2009-07-16 19:00:05