为什么非同步对象的性能优于同步对象?

Sab*_*thy 3 java multithreading synchronized

在阅读本文后出现问题.同步和非同步对象有什么区别?为什么非同步对象比同步对象表现更好?

Gra*_*ray 8

同步和非同步对象有什么区别?为什么非同步对象的性能优于同步对象?

HashTable被认为是同步的,因为它的方法被标记为synchronized.每当线程进入synchronized方法或synchronized块时,它必须首先获得对与正在同步的对象实例相关联的监视器的独占控制.如果另一个线程已经在synchronized同一个对象的块中,那么这将导致线程阻塞,这是其他人提到的性能损失.

但是,该synchronized块还会在之前和之后执行内存同步,这会影响内存高速缓存,并且还会限制代码重新排序/优化,这两者都会对性能产生重大影响.所以即使你有一个线程调用进入synchronized块(即没有阻塞),它将比没有运行慢.

由于独立的CPU高速内存缓存,实现了线程程序的真正性能改进之一.当线程程序执行内存同步时,已更新的高速缓存内存块需要写入主内存,对主内存进行的任何更新都将使本地高速缓存内存无效.通过同步更多,即使在单线程程序中,您也会看到性能损失.

另外,HashTable是一个较老的班级.如果你想要一个可重入,Map那么ConcurrentHashMap应该使用.