У меня проблемы с тем, что Synchronized ведет себя не так, как я ожидал, я пытался использовать ключевое слово volatile:
Общий объект:
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();
}
}
Иногда я получаю "В Ливии Нить круто, Конго"
что никогда не должно случиться. Я ожидаю только:
"В Ливии Нить Ливия потрясающая"
"In Congo Thread congo cool"
Я не ожидаю, что они будут смешанными.