我希望两个线程共享变量,但有时在运行时它会输出两次,而不是1和2。
public class man implements Runnable{
int value = 0;
public static void main(String[] args){
Runnable job = new man();
Thread work1 = new Thread(job);
work1.setName("Thread1");
Thread work2 = new Thread(job);
work2.setName("Thread2");
work1.start();
work2.start();
}
public void run(){
synchronized(this){
value = value + 1;
}
System.out.println("VALUE = " + value +", Running " + Thread.currentThread().getName());
}
}
输出有时是:
VALUE = 2, Running Thread2
VALUE = 2, Running Thread1
和其他时间是:
VALUE = 1, Running Thread2
VALUE = 2, Running Thread1
为什么会这样?我正在HeadFirst书中学习Java,这个问题出现了。
答案 0 :(得分:3)
您未在System.out.println
来电中同步访问权限,因此偶尔会出现" second"第一个线程"之前的线程增量打印。
答案 1 :(得分:3)
您需要同步对变量的访问权限。
发生的事情是,两个线程都在读取变量的值后才读取变量的值。换句话说:
解决方案是在System.out.println("VALUE = " + value +", ...);
块内移动synchronized
。这迫使上述序列重新排序为: