从概念上讲,
Mutex
Reader's/Writer lock (Better form of Mutex)
Semaphore
Condition Variable被用作四种主要的同步机制,它们纯粹是基于锁的。不同的编程语言对这4种机制有不同的术语/行话。POSIX pthread包就是这种实现的一个这样的例子。
前两个使用自旋锁(忙-等待)实现。
最后两个是使用睡眠锁实现的。
基于锁的同步在cpu周期方面是昂贵的。
但是,我了解到java.util.concurrent包并不使用基于锁(睡眠/旋转)的机制来实现同步。
我的问题是:
java并发包实现同步的机制是什么?因为自旋锁是cpu密集型的,而且由于频繁的上下文切换,休眠锁比自旋锁更昂贵。
发布于 2014-10-24 20:09:10
这在很大程度上取决于您使用的java.util.concurrent包的哪些部分(在较小程度上取决于实现)。例如,Java1.7的LinkedBlockingQueue同时使用了ReentrantLocks和Conditions,而java.util.concurrent.atomic类或CopyOnWrite*类则依赖于挥发+本机方法(插入适当的内存屏障)。
锁、信号量等的实际本机实现也因架构和实现的不同而不同。
编辑:如果你真的关心性能,你应该measure你的特定工作负载的性能。在JVM团队中,有比我聪明得多的人,比如A. Shipilev (他的网站上有大量关于这个主题的信息),他们做这件事,并且非常关心JVM的性能。
发布于 2014-10-24 20:53:08
这个问题最好的答案是查看source code for java.util.concurrent。具体的实现取决于您所引用的类。
例如,许多实现使用volatile数据和sun.misc.Unsafe,这将比较和交换推迟到本机操作。Semaphore (通过AbstractQueuedSynchronizer)大量使用了这一点。
您可以浏览那里的其他对象(使用该站点左侧的导航窗格),以查看其他同步对象及其实现方式。
发布于 2014-10-25 06:09:20
简短的回答是否定的。
与同步集合相比,并发集合不是使用锁实现的。
我自己也遇到了与被问到的问题完全相同的问题,我想始终了解细节。最终帮助我完全理解到底是怎么回事的是阅读了下面关于java并发实践的章节:
5.1同步的集合
5.2并发集合
这个想法是基于做原子操作,这基本上不需要锁,因为它们是原子的。
https://stackoverflow.com/questions/26547467
复制相似问题