如果類A有兩個同步方法,比如methodA和methodB。如果一個線程訪問methodA,另一個線程是否可以訪問methodB?根據我的理解,當訪問methodA時,線程獲取對象的鎖定,另一個線程不應該同時訪問methodB。但是這會降低性能,對吧?而且,我似乎習慣讀一篇文章說另一個線程可以訪問methodB。哪一個是正確的?java如何同步工作
回答
如果A類有兩個同步方法,比如methodA和methodB。如果一個線程訪問methodA,另一個線程是否可以訪問methodB?根據我的理解,當訪問methodA時,線程獲取對象的鎖定,另一個線程不應該同時訪問methodB。
沒錯;如果一個線程持有該對象的鎖,則其他線程必須等待才能獲得該鎖。當然,如果兩個線程都在完全相同的對象上調用方法,情況就是如此。
但是這會降低性能很多,對吧?
它可能會影響性能,但有時例如有必要防止兩個線程同時修改相同的數據。
而且,我似乎用來閱讀一篇文章,說另一個線程可以訪問methodB。哪一個是正確的?
第一個是正確的,第二個是不正確的。
但是這會降低性能很多,對吧?
它可能或不可能。這取決於應用程序的性質。同步成本可能接近於零,也可能是一個主要瓶頸,有效地將多線程應用程序轉變爲單線程應用程序。
參見Amdahl's Law。
而且,我似乎用來閱讀一篇文章,說另一個線程可以訪問
methodB
。
沒有其他線程可以在同一個對象上調用methodB
而methodA
運行。當然,其他線程可以在同一類的其他實例上自由呼叫methodB
。
>接近零成本 - 即使不需要同步,也幾乎不會接近於零。你可以比較ArrayList和Vector類的性能來看看 – popfalushi
爲了證明我做了一個實驗的一點。代碼和結果在下面的註釋代碼中:http://pastebin.com/UzxdzvV4。 Arraylist.add比Vector.add快2-3倍,這是ArrayList的同步版本。 – popfalushi
@popfalushi說你有很多線程在執行緩慢的磁盤操作,並將它們的結果存儲在單個對象中......同步的開銷幾乎爲零,對嗎? –
- 1. 在Java中如何同步工作
- 2. 同步如何在Java中工作?
- 3. Java同步函數工作,同步塊不工作
- 4. 同步塊如何工作?
- 5. Java同步塊不能正常工作
- 6. java在方法上同步不工作?
- 7. 如何使用java同步文件操作?同步或鎖定?
- 8. 如何在setter在Java中工作時同步getter
- 9. 同步靜態方法在Java中如何工作?
- 10. 同步功能在java中如何工作?
- 11. 同步列表如何工作?
- 12. FileMaker Pro 10 - 同步性如何工作?
- 13. Dropbox同步是如何工作的?
- 14. NSUbiquitousKeyValueStore的內部同步如何工作?
- 15. 排序節點同步如何工作?
- 16. 同步是如何工作的?
- 17. BitTorrent同步祕密如何工作?
- 18. MS Ado.Net同步框架如何工作?
- 19. 唐`工作同步
- 20. 如何同步Java代碼
- 21. 同步Eclipse工作區,不同的操作系統,如何?
- 22. 如何在現場/遠程工作,並始終同步工作
- 23. Java同步不起作用
- 24. Eclipse Svn同步不工作?
- 25. javascript:工作人員同步
- 26. 同步Eclipse工作區
- 27. 同步任務不工作
- 28. Python的asyncio同步工作
- 29. BackgroundWorker中的同步工作
- 30. GetCallbackEventReference不能同步工作
取決於您使用的鎖。如果該方法是同步的,則在執行時只有一個線程可以訪問它。 – Shark