我有两种情况:
情况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的区别吗?非常感谢!
答案 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)
正如您可能怀疑的那样,从并发的角度来看没有区别。