单线程应用程序中的同步方法是否更慢?

dim*_*414 11 java multithreading synchronization

在过去的几分钟里,我一直在为自己辩论,而且我看到了是和否的原因.这源于查看Java HashMap与Hashtable的答案,并看到有几个人说Hashtable实际上更慢.

在我看来,如果在单个线程中运行,同步方法应该与其非同步方法完全没有区别,因为同步操作不应该阻塞任何内容.也就是说,我认为编译器会以不同的方式处理这两种情况,这就是人们说同步速度较慢的原因.

并不是说它无论如何都是决定性的,但是我对HashMap和Hashtable进行了一些简单的测试,并且看到了速度上的差别.

Edd*_*die 15

是的,使用同步的单线程Java程序可能比没有同步时稍慢.对于早期Java版本,同步很昂贵.但是,对于任何现代版本,无竞争同步都相当便宜.我不担心这个.

请注意,Java 6和Java 7在锁定方面有很好的优化:

  • 锁定粗化
  • 锁定省略
  • 自适应旋转锁定
  • 偏向锁定

有关更多信息,请参阅Java SE 6性能白皮书.另请注意,多核CPU上的无竞争同步似乎比单核CPU上更昂贵,可能是由于Java内存模型要求同步强制本地CPU高速缓存与其他CPU或其他内存屏障共享.例如,阅读Do Do Java 6线程优化实际上有效吗?- 第二部分.(第一部分不如第二部分那么富有洞察力.)


Mit*_*eat 5

是.由于维护锁的额外开销,它们会稍微慢一些.

  • 就这么轻微.+1 (3认同)