【发布时间】:2014-11-25 17:57:16
【问题描述】:
我有以下代码:
class Hi
{
public static void main (String [] args)
{
int a = 1;
for (int i = 0; i < 50; i++) {
a = a + i;
System.out.println ("a before sleep is " + a);
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
}
System.out.println ("a after sleep is " + a);
}
}
}
我打开两个控制台窗口并在第一个窗口中执行java Hi。然后等待大约 10 秒,然后在第二个窗口中执行相同操作。两个输出是一样的:
a before sleep is 1
a after sleep is 1
a before sleep is 2
a after sleep is 2
a before sleep is 4
a after sleep is 4
a before sleep is 7
a after sleep is 7
a before sleep is 11
a after sleep is 11
没有交错。那么,如果我什至不费心使用synchronized 语句,并发问题会引起什么轰动呢?是不是因为从不同控制台窗口运行的代码在不同的处理器内核上执行?如果是这样,我已经进行了大约 20 次这个实验,结果还是一样。
【问题讨论】:
-
我不明白。你预计会发生什么?
-
所以你正在运行 2 个不同的程序?
-
请注意,即使您确实有多个线程,局部变量通常仍然不会共享。如果您启动两个线程,并且两个线程都调用
mainProcess方法,并且该方法有一个局部变量(如您的示例中的a),则每个方法仍然有自己的该变量的副本,并且不会有并发问题。 -
@ajb:虽然如果两个变量引用同一个object,你又可以共享了。 (不过与
int之类的原语无关。) -
两者在不同的JVM中
标签: java concurrency