[英]Why do unsynchronized objects perform better than synchronized ones?
同步和非同步对象有什么区别? 为什么非同步对象的性能优于同步对象?
HashTable
被视为已同步,因为其方法被标记为已synchronized
。 每当线程进入synchronized
方法或synchronized
块时,它必须首先获得对与正在同步的对象实例相关联的监视器的独占控制。 如果另一个线程已经在同一个对象的synchronized
块中,那么这将导致线程阻塞,这是其他人提到的性能损失。
但是, synchronized
块还会在之前和之后执行内存同步,这会影响内存高速缓存,并且还会限制代码重新排序/优化,这两者都会对性能产生重大影响。 因此,即使您有一个线程调用进入synchronized
块(即没有阻塞),它将比没有运行慢。
由于独立的CPU高速内存缓存,实现了线程程序的真正性能改进之一。 当线程程序执行内存同步时,已更新的高速缓存内存块需要写入主内存,对主内存进行的任何更新都将使本地高速缓存内存无效。 通过同步更多,甚至在单线程程序中,您将看到性能损失。
另外, HashTable
是一个较旧的类。 如果你想要一个可重入的Map
那么应该使用ConcurrentHashMap
。
通俗的说,Synchronized Object是一个单线程模型,如果有2个线程要修改同步对象。 如果第一个获取Object的锁定,那么最后一个应该是waite.but如果Object是Unynchronized,它们可以同时操作该对象,这就是为什么Unsynchronized不安全的原因。
为了使同步工作,JVM必须防止多个线程一次进入同步块。 这需要额外的处理,而不是同步块不存在,从而在JVM上增加额外负载,从而降低性能。
发生同步时确切的锁定机制在Java虚拟机如何执行线程同步中进行说明
同步很有用,因为它允许您防止代码同时运行两次(通常称为并发 )。 由于多种原因,这在线程环境中很重要。 为了提供这种保证,JVM必须做额外的工作,这意味着性能会降低。 因为同步要求一次只允许执行一个进程,所以它可能导致多线程程序的运行速度比单线程程序慢(或慢)!
值得注意的是,性能下降的数量并不总是很明显。 根据具体情况,减少量可能很小或很大。 这取决于各种各样的事情。
最后,我想补充一个简短的警告:使用同步进行并发编程很难 。 我发现通常其他并发控件更适合我的需求。 我最喜欢的一个是Atomic Reference 。 这个实用程序很棒,因为它限制了同步代码的数量。 这使得它更易于阅读,维护和编写。
同步:
Array List是非同步的,这意味着多个线程可以同时在Array List上工作。 例如,如果一个线程正在Array List上执行add操作,那么在多线程环境中可能会有另一个线程同时在Array List上执行remove操作
Vector同步。 这意味着如果一个线程正在处理Vector,则没有其他线程可以获取它。 与Array List不同,一次只有一个线程可以对vector执行操作。
性能:
与非同步操作相比,同步操作消耗更多时间,因此如果不需要线程安全操作,则阵列列表是更好的选择,因为并发进程会提高性能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.