我的测试程序要求输入一个字符串并每 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: