2013-04-02 53 views
1

如果類A有兩個同步方法,比如methodA和methodB。如果一個線程訪問methodA,另一個線程是否可以訪問methodB?根據我的理解,當訪問methodA時,線程獲取對象的鎖定,另一個線程不應該同時訪問methodB。但是這會降低性能,對吧?而且,我似乎習慣讀一篇文章說另一個線程可以訪問methodB。哪一個是正確的?java如何同步工作

+0

取決於您使用的鎖。如果該方法是同步的,則在執行時只有一個線程可以訪問它。 – Shark

回答

5

如果A類有兩個同步方法,比如methodA和methodB。如果一個線程訪問methodA,另一個線程是否可以訪問methodB?根據我的理解,當訪問methodA時,線程獲取對象的鎖定,另一個線程不應該同時訪問methodB。

沒錯;如果一個線程持有該對象的鎖,則其他線程必須等待才能獲得該鎖。當然,如果兩個線程都在完全相同的對象上調用方法,情況就是如此。

但是這會降低性能很多,對吧?

它可能會影響性能,但有時例如有必要防止兩個線程同時修改相同的數據。

而且,我似乎用來閱讀一篇文章,說另一個線程可以訪問methodB。哪一個是正確的?

第一個是正確的,第二個是不正確的。

1

但是這會降低性能很多,對吧?

它可能或不可能。這取決於應用程序的性質。同步成本可能接近於零,也可能是一個主要瓶頸,有效地將多線程應用程序轉變爲單線程應用程序。

參見Amdahl's Law

而且,我似乎用來閱讀一篇文章,說另一個線程可以訪問methodB

沒有其他線程可以在同一個對象上調用methodBmethodA運行。當然,其他線程可以在同一類的其他實例上自由呼叫methodB

+0

>接近零成本 - 即使不需要同步,也幾乎不會接近於零。你可以比較ArrayList和Vector類的性能來看看 – popfalushi

+0

爲了證明我做了一個實驗的一點。代碼和結果在下面的註釋代碼中:http://pastebin.com/UzxdzvV4。 Arraylist.add比Vector.add快2-3倍,這是ArrayList的同步版本。 – popfalushi

+0

@popfalushi說你有很多線程在執行緩慢的磁盤操作,並將它們的結果存儲在單個對象中......同步的開銷幾乎爲零,對嗎? –