1

如果类 A 有两个同步方法,比如 methodA 和 methodB。如果一个线程正在访问methodA,另一个线程可以访问methodB吗?根据我的理解,当访问methodA时,线程获取对象的锁,其他线程应该不能同时访问methodB。但这会大大降低性能,对吧?而且,我似乎习惯阅读一篇文章,说另一个线程可以访问方法B。哪一个是正确的?

4

2 回答 2

5

如果类 A 有两个同步方法,比如 methodA 和 methodB。如果一个线程正在访问methodA,另一个线程可以访问methodB吗?根据我的理解,当访问methodA时,线程获取对象的锁,其他线程应该不能同时访问methodB。

这是正确的; 如果一个线程持有对象的锁,其他线程必须等待才能获得锁。当然,只有当两个线程都在完全相同的对象上调用方法时才会出现这种情况。

但这会大大降低性能,对吧?

它可能会影响性能,但有时它是必要的,例如防止两个线程同时修改相同的数据。

而且,我似乎习惯阅读一篇文章,说另一个线程可以访问方法B。哪一个是正确的?

第一个是正确的,第二个是不正确的。

于 2013-04-02T10:04:42.237 回答
1

但这会大大降低性能,对吧?

它可能会,也可能不会。这取决于应用程序的性质。同步的成本可能接近于零,也可能是主要瓶颈,有效地将多线程应用程序转变为单线程应用程序。

参见阿姆达尔定律

而且,我似乎习惯于阅读一篇文章说另一个线程可以访问methodB.

运行时没有其他线程可以调用methodB 同一个对象methodA。当然,其他线程可以自由调用同一类的methodB 其他实例

于 2013-04-02T10:02:08.247 回答