赞
踩
如果需要使用上述功能,选用ReentrantLock是一个很好的选择,那如果是基于性能考虑呢?关于synchronized和ReentrantLock的性能问题,Brian Goetz对这两种锁在JDK 1.5与单核处理器,以及JDK 1.5与双Xeon处理器环境下做了一组吞吐量对比的实验 [1] ,实验结果可以看出,多线程环境下synchronized的吞吐量下降得非常严重,而ReentrantLock则能基本保持在同一个比较稳定的水平上。与其说ReentrantLock性能好,还不如说synchronized还有非常大的优化余地。后续的技术发展也证明了这一点,JDK 1.6中加入了很多针对锁的优化措施(13.3节我们就会讲解这些优化措施),JDK 1.6发布之后,人们就发现synchronized与ReentrantLock的性能基本上是完全持平了。因此,如果读者的程序是使用JDK 1.6或以上部署的话,性能因素就不再是选择ReentrantLock的理由了,虚拟机在未来的性能改进中肯定也会更加偏向于原生的synchronized,所以还是提倡在synchronized能实现需求的情况下,优先考虑使用synchronized来进行同步。
优化掉很大一部分不必要的加锁)、用户态核心态转换、维护锁计数器和检查是否有被阻塞的线程需要唤醒等操作。随着硬件指令集的发展,我们有了另外一个选择:基于冲突检测的乐观并发策略,通俗地说,就是先进行操作,如果没有其他线程争用共享数据,那操作就成功了;如果共享数据有争用,产生了冲突,那就再采取其他的补偿措施(最常见的补偿措施就是不断地重试,直到成功为止),这种乐观的并发策略的许多实现都不需要把线程挂起,因此这种同步操作称为非阻塞同步(Non-Blocking Synchronization)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。