是否有人知道锁定Java对程序的执行速度的影响?如果有的话,我们如何克服这种影响?具体的参考文献是赞赏..
答案 0 :(得分:4)
如果您的应用程序主要是单线程,那么在进行过多锁定时,您可能看不到或只有很少的性能下降。
通常,在使用java.concurrent库或build-in synchronized关键字时,可以非常快速有效地获取单个锁。他们使用Lock elision,自适应锁定和锁定粗化等技术(参见Synchronization optimizations in Mustang),这基本上意味着编译器和/或库做了一些非常聪明的事情来优化锁的使用。
这尤其适用于不需要锁定的情况;编译器将其优化掉。
但是,当许多线程需要获取相同的锁时,您最终会注意到,对于纯粹的计算问题,核心的CPU负载永远不会达到100%。实际上,某些事情并没有尽可能快,而你的CPU只是处于空闲状态。
如果没有(重)IO,这往往是过度lock contention
的迹象,这确实会降低整体系统性能。
答案 1 :(得分:3)
锁定成本因Java的不同版本而异。对于Java< = 1.4,锁定相对昂贵。但是对于Java 5.0,内置锁定得到了改进,但新的并发锁定再次更快。在Java 6中,两者的速度都快。
作为指南,您可以预期Java 6上的锁定成本在0.5到2.0微秒之间。
执行锁定可能很昂贵,因为它涉及对底层操作系统的调用。 (在虚拟机上更昂贵)一种避免的方法是使用具有内存屏障的CAS操作。
然而,降低锁定成本的最简单/最好的方法是构建程序,以便线程可以运行更长的时间而不相互依赖。
当他们谈论在用Java编写的高吞吐量交易系统中使用锁定时,您可能会发现此链接很有趣。 http://www.infoq.com/presentations/LMAX
答案 2 :(得分:2)
以下是SO中有用的链接Runtime performance optimizations和Synchronization performance tips以及Java synchronization and performance in an aspect。
如果您正在编写多线程编程,请使用java.util.concurrent
包而不是wait() notify() sleep() stop()
旧方法。
并发性是一个真正的批评主题,你不能说它如何影响执行速度。如果它是正确的,那么它是好的,如果没有,不是
答案 3 :(得分:1)
我同意@pst并且想补充一点,虽然他们说同步会降低性能但我在测试中没有看到这种效果。我试着测量这种减少是如何减少的,并且看到这几乎不存在。在Java的早期阶段,这种影响可能更为重要。
尝试避免额外同步的示例是单例模式中的getInstance()方法的实现。最简单的方法是同步此方法(可能)导致性能下降。下一步(不起作用)是双重检查锁定。最后,更好的解决方案是将实例的引用交给内部类。
答案 4 :(得分:1)
任何算法中的锁定(或更正式的,任何类型的序列化)都会限制其在多CPU /多机环境中的可扩展性。 Amdahl's Law最好地描述了它。
实际上(在Java中)锁定在纯粹顺序程序上的开销可以忽略不计。如此处其他地方所述,只有在您有争用时才会出现性能问题。