如何java同步工作

时间:2013-04-02 09:58:45

标签: java

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

2 个答案:

答案 0 :(得分:5)

  

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

这是对的;如果一个线程持有对象的锁,其他线程必须等待才能获得锁。当然,如果两个线程都在完全相同的对象上调用方法,则情况就是这样。

  

但这会大幅降低表现,对吗?

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

  

而且,我似乎习惯于阅读一篇文章说其他线程可以访问methodB。哪一个是正确的?

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

答案 1 :(得分:1)

  

但这会大幅降低表现,对吗?

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

请参阅Amdahl's Law

  

而且,我似乎习惯阅读一篇文章,说其他帖子可以访问methodB

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