首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java并发包是使用锁实现的吗?

java并发包是使用锁实现的吗?
EN

Stack Overflow用户
提问于 2014-10-24 20:00:53
回答 4查看 493关注 0票数 0

从概念上讲,

代码语言:javascript
复制
Mutex

Reader's/Writer lock (Better form of Mutex)

Semaphore

Condition Variable

被用作四种主要的同步机制,它们纯粹是基于锁的。不同的编程语言对这4种机制有不同的术语/行话。POSIX pthread包就是这种实现的一个这样的例子。

前两个使用自旋锁(忙-等待)实现。

最后两个是使用睡眠锁实现的。

基于锁的同步在cpu周期方面是昂贵的。

但是,我了解到java.util.concurrent包并不使用基于锁(睡眠/旋转)的机制来实现同步。

我的问题是:

java并发包实现同步的机制是什么?因为自旋锁是cpu密集型的,而且由于频繁的上下文切换,休眠锁比自旋锁更昂贵。

EN

回答 4

Stack Overflow用户

发布于 2014-10-24 20:09:10

这在很大程度上取决于您使用的java.util.concurrent包的哪些部分(在较小程度上取决于实现)。例如,Java1.7的LinkedBlockingQueue同时使用了ReentrantLocks和Conditions,而java.util.concurrent.atomic类或CopyOnWrite*类则依赖于挥发+本机方法(插入适当的内存屏障)。

锁、信号量等的实际本机实现也因架构和实现的不同而不同。

编辑:如果你真的关心性能,你应该measure你的特定工作负载的性能。在JVM团队中,有比我聪明得多的人,比如A. Shipilev (他的网站上有大量关于这个主题的信息),他们做这件事,并且非常关心JVM的性能。

票数 3
EN

Stack Overflow用户

发布于 2014-10-24 20:53:08

这个问题最好的答案是查看source code for java.util.concurrent。具体的实现取决于您所引用的类。

例如,许多实现使用volatile数据和sun.misc.Unsafe,这将比较和交换推迟到本机操作。Semaphore (通过AbstractQueuedSynchronizer)大量使用了这一点。

您可以浏览那里的其他对象(使用该站点左侧的导航窗格),以查看其他同步对象及其实现方式。

票数 2
EN

Stack Overflow用户

发布于 2014-10-25 06:09:20

简短的回答是否定的。

与同步集合相比,并发集合不是使用锁实现的。

我自己也遇到了与被问到的问题完全相同的问题,我想始终了解细节。最终帮助我完全理解到底是怎么回事的是阅读了下面关于java并发实践的章节:

5.1同步的集合

5.2并发集合

这个想法是基于做原子操作,这基本上不需要锁,因为它们是原子的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26547467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档