1

我有两种情况:

情况 1:有 2 个线程,它们共享一个具有 doSomething() 方法的类的实例。情况 2:有 2 个线程,每个线程都有一个具有 doSomething() 方法的类的实例。

void doSomething() {
    for (int i = 0; i < 20; i++) {
            System.out.println(Thread.currentThread().getName());
        }

当 2 个线程启动时,它们都调用 doSomething()。查看输出,我看不出情况 1 和 2 之间的区别。

2 个线程(线程 A 和 B )的输出是这样的: AAAABBBAABBBB ....

你能告诉我情况 1 和 2 的 CONCURRENCY 的区别吗?非常感谢!

4

4 回答 4

1

由于操作不会影响任何状态变量(实例变量),因此您将无法看到上述情况的差异。试试这样的方法:

class C {
 int i = 0;
 synchronized void doSomething() {
  while(i < 20) {
   System.out.println( Thread.currentThread().getName() + " : Value for i=" + i );
   i++;
  }
 }
}

如果您使用 2 个单独的对象运行上述程序,则每个线程将打印 20 个值(从 0 到 19)。如果您使用共享同一对象的 2 个线程运行上述操作,则OVERALL 2 个线程将打印 20 个值,但不确定哪个线程将打印什么值,因为您无法预测哪个线程将增加该i值。

于 2013-04-29T15:19:45.567 回答
1

如果线程正在接触它们正在运行的对象的成员数据,则这两种情况之间只有区别。

使用两个线程和两个对象,您会看到它们都独立运行。

对于两个线程和一个对象,您会看到它们相互干扰,在成员变量中覆盖彼此的值。这被称为竞态条件,由于它是间歇性的,因此查找和调试非常痛苦。处理两个共享变量的线程是信号量和锁语句存在的原因。

于 2013-04-29T15:20:26.733 回答
0

没有区别。

除了synchronized关键字,线程不关心实例。

于 2013-04-29T15:17:58.600 回答
0

正如您可能怀疑的那样,从并发的角度来看没有区别。

于 2013-04-29T15:18:24.467 回答