如果A类有两个同步方法,比如methodA和methodB。如果一个线程正在访问methodA,另一个线程可以访问methodB吗?根据我的理解,当访问methodA时,线程获取对象的锁定,其他线程不应该同时访问methodB。但这会使性能降级很多,对吧?而且,我似乎习惯于阅读一篇文章说其他线程可以访问methodB。哪一个是正确的?
答案 0 :(得分:5)
如果A类有两个同步方法,比如methodA和methodB。如果一个线程正在访问methodA,另一个线程可以访问methodB吗?根据我的理解,当访问methodA时,线程获取对象的锁定,其他线程不应该同时访问methodB。
这是对的;如果一个线程持有对象的锁,其他线程必须等待才能获得锁。当然,如果两个线程都在完全相同的对象上调用方法,则情况就是这样。
但这会大幅降低表现,对吗?
它可能会影响性能,但有时需要,例如防止两个线程同时修改相同的数据。
而且,我似乎习惯于阅读一篇文章说其他线程可以访问methodB。哪一个是正确的?
第一个是正确的,第二个是不正确的。
答案 1 :(得分:1)
但这会大幅降低表现,对吗?
它可能,也可能不会。这取决于应用程序的性质。同步可能具有接近零的成本,或者它可能是一个主要的瓶颈,有效地将多线程应用程序转换为单线程应用程序。
请参阅Amdahl's Law。
而且,我似乎习惯阅读一篇文章,说其他帖子可以访问
methodB
。
当methodB
正在运行时,没有其他线程可以在同一个对象上调用methodA
。当然,其他线程可以在同一类的其他实例上自由调用methodB
。