Monitor =互斥(锁定)+条件变量
每个Java对象都有一个监视器,保持原则。
synchronized
关键字声称对象的监视器(lock + conditionvar)。
我的理解是,对于原子性,不需要conditionvar,lock(互斥)就足够了。
为了保持内存区域的原子性,Java提供了Lock,atomic包和binary semaphore。
对于原子性,哪种方法在性能方面更好?
答案 0 :(得分:0)
这取决于访问模式:synchronized(var) { ... }
是最简单的,因为它不需要显式解锁,这与ReentrantLock
不同。这两个是相同的:synchronized(var)
将锁定var
,而Lock
将锁定"本身" (所以说)。但ReentrantLock
允许您获取扩展信息(有关详情,请参阅javadoc:isHeldByCurrentThread()
和getHoldCount()
)。
在性能方面,ReentrantReadWriteLock
会在您有少量写入和许多读取时提高性能(因为您不需要锁定&em> #39;只能读取),但是在获取和释放锁时你应该格外小心,因为"ownable synchronizers"会使你的线程死锁(读写锁不会以同样的方式处理)。
但是,如果您想要读/写的数据是"简单类型" (如atomic package javadoc中所述),您将使用AtomicInteger
等获得最佳性能,因为它们使用特定的优化CPU指令集,例如{{ 3}}在SSE *中。