【发布时间】:2015-05-25 12:54:14
【问题描述】:
我是 Java 线程的新手,因此有这个疑问。我读到 '同步非静态方法块' 只允许一个线程进入块(当然,对于非静态块的一个实例)。但是,它似乎不起作用。我错过了什么吗? 看下面的代码。
class A extends Thread
{
public void run()
{
B.b.add();
}
}
class B
{
static B b=new B();
int i;
public synchronized void add()
{
i++;
}
}
public class Sample
{
public static void main(String[] args)
{
for(int i=0;i<10;i++)
{
new A().start();
}
System.out.println(B.b.i);
}
}
【问题讨论】:
-
等等,是不是跟缓存写策略有关?因为我预计会打印一个结果“10”,但结果是随机的,从 0 到 9。
-
抱歉,知道了。主线程在值被所有线程递增之前打印该值(因为并行执行)。所有线程完成执行后如何打印值?
-
如果你想等待所有线程,你必须在循环后加入它们,请参阅:docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join()
标签: java multithreading synchronization synchronized java-threads