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

Concurrency Java:两个线程可以在一个对象上同时运行相同的非同步方法吗?,concurrency,Concurrency,我有两种情况: 情形1:有两个线程,它们共享具有doSomething()方法的类的一个实例。 情形2:有2个线程,每个线程都有一个类的实例,该类具有doSomething()方法 void doSomething(){ 对于(int i=0;i

我有两种情况:

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

void doSomething(){
对于(int i=0;i<20;i++){
System.out.println(Thread.currentThread().getName());
}
当这两个线程启动时,它们都会调用doSomething()

两个线程(线程A和线程B)的输出是这样的:A B B


您能告诉我情形1和情形2在并发性方面的区别吗?非常感谢!

没有区别


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

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

您将无法看到上述情况的区别,因为该操作不会影响任何状态变量(实例变量)。请尝试以下方法:

class C {
 int i = 0;
 synchronized void doSomething() {
  while(i < 20) {
   System.out.println( Thread.currentThread().getName() + " : Value for i=" + i );
   i++;
  }
 }
}
C类{
int i=0;
同步无效剂量测定法(){
而(i<20){
System.out.println(Thread.currentThread().getName()+”:i=“+i”的值);
i++;
}
}
}
如果您使用两个单独的对象运行上述操作,则每个线程将打印20个值(从0到19)。
如果您使用共享同一对象的两个线程运行上述操作,总的来说这两个线程将打印20个值,但不确定哪个线程将打印什么值,因为您无法预测哪个线程将增加
i
值。

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

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


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

该方法应该是静态的。谢谢你的回答,我已经用两个线程和一个对象测试了你的代码。但是,只有一个线程打印0到19之间的值。另一个线程什么都不做,因为当时我是20。我必须在while循环外再添加一行:I=0;将I的值重置为0,然后我明白你的意思。不管怎样,你的代码让我知道了我想知道的。谢谢!
class C {
 int i = 0;
 synchronized void doSomething() {
  while(i < 20) {
   System.out.println( Thread.currentThread().getName() + " : Value for i=" + i );
   i++;
  }
 }
}