阅读this one后出现问题。同步和非同步对象有什么区别?为什么非同步对象的性能优于同步对象?
答案 0 :(得分:8)
同步和非同步对象有什么区别?为什么非同步对象的性能优于同步对象?
HashTable
被视为已同步,因为其方法标记为synchronized
。每当线程进入synchronized
方法或synchronized
块时,它必须首先获得对与正在同步的对象实例相关联的监视器的独占控制。如果另一个线程已经在同一个对象的synchronized
块中,那么这将导致线程阻塞,这是其他人提到的性能损失。
但是,synchronized
块还会在内存缓存影响之前和之后进行内存同步,并且还会限制代码重新排序/优化,这两者都会对性能产生重大影响。因此,即使您有一个线程调用进入synchronized
块(即没有阻塞),它也会比没有阻塞运行速度慢。
由于独立的CPU高速内存缓存,实现了线程程序的真正性能改进之一。当线程程序执行内存同步时,已更新的高速缓存内存块需要写入主内存,对主内存进行的任何更新都将使本地高速缓存内存无效。通过同步更多,即使在单线程程序中,您也会看到性能损失。
顺便说一句,HashTable
是一个较老的班级。如果您想要可重入Map
,则应使用ConcurrentHashMap
。
答案 1 :(得分:2)
流行说来,Synchronized Object是一个单线程模型,如果有2个线程想要修改Synchronized Object。如果第一个获取Object的锁定,那么最后一个应该是waite.but如果Object是Unynchronized,它们可以同时操作该对象,这就是为什么Unsynchronized不安全的原因。
答案 2 :(得分:2)
要使同步正常工作,JVM必须防止多个线程一次进入同步块。这需要额外的处理,而不是同步块不存在,从而在JVM上增加了额外的负载,从而降低了性能。
How the Java virtual machine performs thread synchronization
中解释了同步发生时的确切锁定机制答案 3 :(得分:0)
同步很有用,因为它允许您防止代码同时运行两次(通常称为并发)。由于多种原因,这在线程环境中很重要。为了提供这种保证,JVM必须做额外的工作,这意味着性能会降低。因为同步要求一次只允许一个进程执行,所以它可能导致多线程程序的运行速度比单线程程序慢(或慢)!
值得注意的是,性能下降的数量并不总是很明显。根据具体情况,减少量可能很小或很大。这取决于各种各样的事情。
最后,我想添加一个简短的警告:使用同步的并发编程是 hard 。我发现通常其他并发控件更适合我的需求。我最喜欢的一个是Atomic Reference。这个实用程序很棒,因为它限制了同步代码的数量。这使得阅读,维护和编写更容易。
答案 4 :(得分:0)
同步:
Array List是非同步的,这意味着多个线程可以工作 在阵列列表上同时。对于例如如果一个线程正在执行 在Array List上添加一个操作,可以有另一个线程 在multi中同时对Array List执行remove操作 线程环境
Vector同步。这意味着如果一个线程正在工作 矢量,没有其他线程可以得到它。与Array List不同 一个线程可以一次对向量执行操作。
效果
与之相比,同步操作消耗的时间更多 非同步的,所以如果不需要线程安全 操作,数组列表是性能更好的选择 由于并发过程而得到改善。