Моя тестовая программа запрашивает строку и печатает ее каждые 2 секунды. Я уже кое-что прочитал о модели памяти Java или о том, как потоки не сразу обновляют свои переменные в основной памяти.Как обновить сразу общие переменные между потоками
Я пробовал с volatile
и static
атрибутами. Синхронизация кодовых блоков, в которых была изменена переменная line
. С wait()/notifi()
, когда переменная была изменена и некоторые другие. Как назначить line
в качестве ссылки, а не как значение? Использую ли я методы, которые я пробовал неправильно? Почему объекты остаются идеально синхронизированными, когда они действуют как мониторы, но они не могут быть, когда они действуют как указатели?
public class TestSharedVariable {
static String line= "";
public static void main(String[] args) {
// For reading from keyboard
Scanner keyboard = new Scanner(System.in);
Printer p = new Printer(line);
p.start();
// Reads a line from keyboard into the shared variable
while(!line.equals("quit")){
line = keyboard.nextLine();
}
}
}
class Printer extends Thread{
private volatile String line;
public Printer(String palabra){
this.line = palabra;
}
/* Prints the line each 2 sec */
@Override
public void run(){
while(!line.equals("quit")){
try {
sleep(2000);
} catch (InterruptedException e) {e.printStackTrace();}
System.out.println(this.getName() + ": " + line);
}
}
}
Выход:
Thread-0:
asdf
Thread-0:
Thread-0:
Есть. Спасибо за супер быстрый ответ. Я переношу переменные в измененный объект. В первый раз я думал, что 'int' не изменен, но' Integer' был. Быстрый поиск показал мне, что JAVA пытается избежать изменчивых объектов. – dinigo
@ demil133: обратите внимание, что ваш код может работать с примитивами, и поэтому нет необходимости их обертывать. Java умна, чтобы избежать изменчивых объектов для строк или примитивных объектов-оберток, поскольку это избавляет вас от множества неприятностей. –
с 'int/boolean/char' и так? Я уже пробовал. Но я раньше ошибался. Я попробую еще раз. – dinigo