java并发包是使用锁实现的吗?
在概念上,java并发包是使用锁实现的吗?,java,multithreading,concurrency,synchronization,Java,Multithreading,Concurrency,Synchronization,在概念上, Mutex Reader's/Writer lock (Better form of Mutex) Semaphore Condition Variable 用作四种主要的同步机制,它们完全基于锁。不同的编程语言对这4种机制有不同的术语/行话。POSIXpthread包就是这种实现的一个例子 前两个使用自旋锁(忙等待)实现 最后两个是使用睡眠锁实现的 基于锁的同步在cpu周期方面非常昂贵 但是,我了解到,java.util.concurrent包不使用基于锁(sleep/sp
Mutex
Reader's/Writer lock (Better form of Mutex)
Semaphore
Condition Variable
用作四种主要的同步机制,它们完全基于锁。不同的编程语言对这4种机制有不同的术语/行话。POSIXpthread
包就是这种实现的一个例子
前两个使用自旋锁(忙等待)实现
最后两个是使用睡眠锁实现的
基于锁的同步在cpu周期方面非常昂贵
但是,我了解到,java.util.concurrent
包不使用基于锁(sleep/spin)的机制来实现同步
我的问题:
java并发包使用什么机制来实现同步?因为自旋锁是cpu密集型的,并且由于频繁的上下文切换,睡眠锁比自旋锁的成本更高。这在很大程度上取决于您使用的java.util.concurrent包的哪些部分(在较小程度上取决于实现)。例如,Java 1.7中的LinkedBlockingQueue使用可重入锁和条件,而Java.util.concurrent.atomic类或CopyOnWrite*类则依赖volaties+本机方法(插入适当的内存屏障) 锁、信号量等的实际本机实现也因体系结构和实现而异
编辑:如果您真的关心性能,您应该考虑您的特定工作负载的性能。JVM团队中有比我聪明得多的人(他们的网站是关于这个主题的信息宝库),他们这样做并且非常关心JVM的性能。这在很大程度上取决于您使用的java.util.concurrent包的哪些部分(在较小程度上取决于实现)。例如,Java 1.7中的LinkedBlockingQueue使用可重入锁和条件,而Java.util.concurrent.atomic类或CopyOnWrite*类则依赖volaties+本机方法(插入适当的内存屏障) 锁、信号量等的实际本机实现也因体系结构和实现而异
编辑:如果您真的关心性能,您应该考虑您的特定工作负载的性能。JVM团队中有比我聪明得多的人(他们的网站是关于这个主题的信息宝库),他们这样做并且非常关心JVM的性能。这个问题最好通过查看。具体的实现取决于所引用的类 例如,许多实现都使用了
volatile
数据和,这延迟了本机操作的比较和交换<代码>信号灯(via)大量使用此功能
您可以浏览那里的其他对象(使用该站点左侧的导航窗格)来查看其他同步对象以及它们是如何实现的。这个问题最好通过查看来回答。具体的实现取决于所引用的类 例如,许多实现都使用了
volatile
数据和,这延迟了本机操作的比较和交换<代码>信号灯(via)大量使用此功能
您可以浏览此处的其他对象(使用该站点左侧的导航窗格),查看其他同步对象及其实现方式。简短的回答是否 与同步集合相比,并发集合不使用锁实现 我自己的问题与被问到的问题完全相同,我希望始终了解细节。帮助我最终完全理解引擎盖下发生的事情的是阅读java并发实践中的以下章节: 5.1同步收集
5.2并发集合
这个想法基于原子操作,基本上不需要锁,因为它们是原子的 简单的答案是否定的 与同步集合相比,并发集合不使用锁实现 我自己的问题与被问到的问题完全相同,我希望始终了解细节。帮助我最终完全理解引擎盖下发生的事情的是阅读java并发实践中的以下章节: 5.1同步收集
5.2并发集合
这个想法基于原子操作,基本上不需要锁,因为它们是原子的 OP的问题和评论交流似乎包含了相当多的混乱。我将避免回答字面上的问题,而是尝试给出一个概述
为什么
java.util.concurrent
成为今天的推荐做法?
因为它鼓励良好的应用程序编码模式。潜在的性能增益(可能会实现,也可能不会实现)是一种奖励,但即使没有性能增益,java.util.concurrent
仍然是推荐的,因为它可以帮助人们编写正确的代码。快速但有缺陷的代码没有价值
java.util.concurrent如何鼓励良好的编码模式?
在很多方面。我只列出几个
(免责声明:我来自C语言背景,对Java的并发包没有全面的了解;尽管Java和C语言之间存在很多相似之处。)
并发数据收集简化了代码。
- 通常,当需要从不同线程访问和修改数据结构时,我们使用锁定
- 典型操作包括:
- 锁定(锁定直到成功)
- 读取和写入值
- 解锁
- 并发数据收集通过将所有这些操作滚动到单个函数调用中来简化这一过程。结果是:
- 调用方的代码更简单,