1
我的测试程序要求输入一个字符串并每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'不是可变的,但是'整数'是。快速搜索告诉我,JAVA试图避免可变对象。 – dinigo 2013-03-27 03:05:08
@ demil133:请注意,您的代码可以与基元一起使用,因此不需要将它们包装起来。 Java很聪明,可以避免使用Strings或原始包装对象的可变对象,因为它可以避免很多麻烦。 – 2013-03-27 03:07:23
'int/boolean/char'等等?我已经尝试过了。但我以前错了。我会再试一次。 – dinigo 2013-03-27 03:09:34