Java:2个线程可以真正同时在一个对象上运行相同的非同步方法吗?

时间:2013-04-29 15:14:52

标签: concurrency

我有两种情况:

情况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)的输出是这样的:A A A A B B B A A B B B B ....

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

4 个答案:

答案 0 :(得分: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值。

答案 1 :(得分:1)

如果线程正在触摸正在运行的对象的成员数据,则两种情况之间只有差异。

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

有两个线程和一个对象,你会看到它们相互干扰,在成员变量中覆盖彼此的值。这被称为竞争条件,并且发现和调试是一个巨大的痛苦,因为它是间歇性的。处理共享变量的两个线程是信号量和锁定语句之类的原因。

答案 2 :(得分:0)

没有区别。

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

答案 3 :(得分:0)

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