如果类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