У меня возникли проблемы с синхронизацией не ведет себя так, как я ожидал, я попытался с помощью летучего ключевого слова также:Java синхронизируются выпуск
Shared Object:
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 awesome» «В Конго Нить конго прохладно»
Я не ожидаю, что они будут смешанными.
В нетривиальной программы, вы, вероятно, хотите, чтобы скрыть даже этот уровень синхронизации. Имея такой метод, как setValueAndReturnString(), он сам синхронизируется.Вы не хотите полагаться на звонящих, обрабатывающих многопоточность правильно. – AngerClown
Согласен. Я просто думал, что, предоставив Мо версию кода, которая должна достичь поведения, которого он искал, и вместе с ответом, который другие предоставили, это поможет ему понять, что не так, и лучше понять, как работает синхронизация. –