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