我有一个基本问题,我无法在网上找到答案:假设我有一个应用程序,其中多个线程共享一个实用程序方法的单个实例,从该实例方法触发可能持久的计算。
大规模的方法调用是否有可能影响方法执行的性能?
编辑:通过“影响性能”我的意思是:显着降低执行速度,甚至阻止方法执行。
答案 0 :(得分:3)
是的,例如,如果该方法使用共享(或有限)资源,则是可能的。
这样的资源可能是锁,数据库连接,(慢)磁盘,甚至是RAM(RAM的数量和可用内存带宽都是有限的)。
答案 1 :(得分:1)
如果方法不共享任何资源。然后不是很多(至少不显着,你会避免争论)。只有在增加垃圾收集,CPU使用率,对象创建等方面,您才会失去性能,但Thread争用和Cache Flushing会更少。从资源我的意思是共享对象,共享I / O.但实际上,您可能至少拥有一个共享资源。
但是如果该方法使用了一些共享资源,那么是,该方法可能是瓶颈。 但是有很多模式可以提高性能。 例如,如果许多线程只读取这样的共享资源,只有少数线程可以写入/更新 共享资源然后您可以使用ReadWriteLocks来保护该锁。或者您可以使用Actor模式 - > http://www.slideshare.net/drorbr/the-actor-model-towards-better-concurrency
另外,请始终尝试使用并发数据结构来共享您的共享资源。 例如,ConcurrentHashMap可以很好地用于在线程之间共享信息。 对于Threads中的生产者消费者问题,请尝试使用BlockingQueue的不同实现。这些数据结构也会降低性能,但您必须为准确性付出代价。
还要记住请首先关注问题的设计然后再进行表现。如果你的设计得当,你将有更好的方法来提高性能。请记住,这些是并发性的常见问题,并且已经有很好的模式可以克服许多缺点。
答案 2 :(得分:0)
垃圾收集器需要清理方法中分配的对象的工作量也会降低性能。虽然这并不严格地归因于并发本身(但仅由于该方法经常被调用),但它更有可能在GC可用的时间已经受到大量活动的限制的环境中产生影响。线程。