我做了一些研究,但我猜不出正确答案。
public class MultiThreadTwo
{
private int count = 0;
public synchronized void increment() // I synchronized it here
{
count++;
}
public static void main (String [] args)
{
MultiThreadTwo app = new MultiThreadTwo();
app.doWork();
}
public void doWork()
{
Thread t1 = new Thread(new Runnable() {
public void run(){
for (int i=0;i<100;i++ )
{
increment(); // increments
}
}
});
Thread t2 = new Thread(new Runnable() {
public void run()
{
for (int i=0;i<100;i++ )
{
increment(); // increments
}
}
});
t1.start();
t2.start();
System.out.println("Count is : "+count);
try
{
t1.join(); // wait for completes
t2.join(); // wait for completes
}catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
我的输出总是不同,如200,182,171,65,140。我怎么能解决这个问题我知道我可以检查计数的值,如果它不是我预期的值,我可以一次又一次地调用运行但它对我没有任何帮助。 synchronized关键字不应该解决这种情况吗?
我错过了什么?
解决方案:加入后的打印计数解决了我的问题。
答案 0 :(得分:7)
如果在打印结果之前加入线程并使计数变为volatile,那么总是会得到200。
尽管挥发性物质在这里没有伤害,但没有必要。从t1和t2计数的访问正常工作,因为increment方法在同一个对象上同步,并且在线程上调用join创建了一个before-before关系。因此,即使没有volatile,主线程也能保证看到正确的count值。