私のテストプログラムは文字列を要求し、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: