首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么 ConcurrentHashMap 读操作不需要加锁?为什么 ConcurrentHashMap 读操作不需要加锁?

来源:cnblogs.com/keeya/p/9632958.html ConcurrentHashMap简介 get操作源码 volatile登场 加在数组上volatile?...---- 我们知道,ConcurrentHashmap(1.8)这个并发集合框架线程安全,当你看到源码get操作时,会发现get操作全程没有加任何锁,这也是这篇博文讨论问题——为什么它不需要加锁呢...,基于长度很长链表遍历一个漫长过程,而红黑树遍历效率很快,代替一定阈值链表,这样形成一个最佳拍档 ?...get操作源码 首先计算hash值,定位到该table索引位置,如果是首节点符合就返回 如果遇到扩容时候,会调用标志正在扩容节点ForwardingNodefind方法,查找该节点,匹配就返回 以上都不符合的话...get操作全程不需要加锁是因为Node成员val用volatile修饰和数组用volatile修饰没有关系。 数组用volatile修饰主要是保证在数组扩容时候保证可见性。

42820

Java 经典面试题:为什么 ConcurrentHashMap 读操作不需要加锁?

来源:http://tinyurl.com/y685vvv9 目录: ConcurrentHashMap简介 get操作源码 volatile登场 加在数组上volatile?...,基于长度很长链表遍历一个漫长过程,而红黑树遍历效率很快,代替一定阈值链表,这样形成一个最佳拍档 ?...img get操作源码 首先计算hash值,定位到该table索引位置,如果是首节点符合就返回 如果遇到扩容时候,会调用标志正在扩容节点ForwardingNodefind方法,查找该节点,匹配就返回...在多处理器下,为了保证各个处理器缓存一致,就会实现缓存一致性协议,当某个CPU在数据时,如果发现操作变量共享变量,则会通知其他CPU告知该变量缓存行无效,因此其他CPU在读取该变量时,...get操作全程不需要加锁是因为Node成员val用volatile修饰和数组用volatile修饰没有关系。 数组用volatile修饰主要是保证在数组扩容时候保证可见性。

1.6K20
您找到你想要的搜索结果了吗?
是的
没有找到

70%Java程序员不知道为啥 ConcurrentHashMap 读操作不需要加锁?

作者:上帝爱吃苹果 目录 ConcurrentHashMap简介 get操作源码 volatile登场 加在数组上volatile?...,基于长度很长链表遍历一个漫长过程,而红黑树遍历效率很快,代替一定阈值链表,这样形成一个最佳拍档 get操作源码 首先计算hash值,定位到该table索引位置,如果是首节点符合就返回...如果遇到扩容时候,会调用标志正在扩容节点ForwardingNodefind方法,查找该节点,匹配就返回 以上都不符合的话,就往下遍历节点,匹配就返回,否则最后就返回null //会发现源码中没有一处加了锁...= null && key.equals(ek)))) return e.val; } } return null; } get没有加锁的话,ConcurrentHashMap如何保证读到数据不是脏数据呢...get操作全程不需要加锁是因为Node成员val用volatile修饰和数组用volatile修饰没有关系。 数组用volatile修饰主要是保证在数组扩容时候保证可见性。

34230

Java异步编程——深入源码分析FutureTask

容易看出来,异步编程好处就在于可以让不相干任务异步执行,阻塞主线程。若是主线程需要异步执行结果,此时再去等待结果会更加高效,提高程序执行效率。 下面来看看整个流程实现原理。...相类似的还有Runnable,它也是接收,不同点在于它不返回结果,也抛异常,异常需要在任务内部处理。总结来说Callable更像一个方法调用,Runnable则是一个不需要理会结果调用。...原来接口只接收Callable参数,实现类中还新增了接收Runnable参数。 如果看过之前《你真的懂ThreadPoolExecutor线程池技术?...但这样并没有异步效果,因为没有启用新线程去跑,而是在原来线程阻塞执行。...如果状态NORMAL,正常结束的话,则把outcome变量返回; 如果是取消或者中断状态,则抛出取消异常; 如果是EXCEPTION,则把outcome当作异常抛出(之前setException()

57230

想做算法,你需要哪些条件?

结果你面的10份简历里面有9个完全不能看,但是出于职业素养以及面试礼仪,你必须要聊完一个小时或者一个半小时,你会是什么心态?是不是抓狂,很多人真遇到了估计肯定要投诉hr了,难道不会筛选一下?...如果你砖头本身比较脆,结实,那你就需要多找点额外材料修补修补,有些人砖头本身过硬,可能不需要太多修补也能把门敲开。现在的确海归很多,名校出身的人也不少,显得竞争压力很大。...第二部分则是对应领域必须会用到模型,比如说如果是推荐领域,那么FM、DIN这类必不可少,如果是CV呢,那么各种CNN也是必须如果是NLP,显然离不开LSTM、RNN。...几个特征、训练一下模型简单大部分人都会,但是基于场景结合数据、模型深度思考,推导出完整提升逻辑则要困难得多。...新模型,新方法,新策略层出穷,只会闭门造成肯定是不行,我们需要有强大学习能力以及学习意识。需要看得懂最新论文,撸得出最新模型,能够进行严谨实验和分析。

95410

【RTOS训练营】环形缓冲区、AT指令、预习安排和晚课提问

另外,如果是直接溢出,也是可行,不过只能指定长度,不实用。...这样的话我们不好写程序判断,所以就退一步,满:下一个位置 == r 我在数据之前先判断一下: 下一个位置, 是不是等于读位置, 如果下一个位置等于读位置的话, 我就假设满了, 我宁愿空出一个空位...问: 环形缓冲区操作中,不用做互斥?只能一对一? 答: 对环形缓冲区,如果说只有一个消费者(读数据)、只有一个生产者(数据)的话,就不需要做互斥操作。...因为你分配了100兆空间,我就跟你说:突然要来1000兆数据, 你分配了1000兆空间,我就跟你说:突然要来1T数据。 绝对、保证数据丢失方法没有的。...根据这个count变量来分辨空还是满,这样的话,这个环境缓冲区,满时候就是真正满了。 12. 问: 程序里面是什么条件时候读缓冲区?

90540

40+个对初学者非常有用PHP技巧(一)

今天我们要介绍一些关于改善和优化PHP代码提示和技巧。请注意,这些PHP技巧适用于初学者,而不是那些已经在使用MVC框架的人。 ? 1.不要使用相对路径,要定义一个根路径 这样代码行常见: ?...不需要任何更多解释。 你还可以进一步改善: ? 这样做可以完成很多事情: 为同一个类文件搜索多个目录。 轻松更改包含类文件目录,而破坏任何地方代码。...在开发计算机上,你可以这样做: ? 并且在服务器上,你可以这样做: ? 4.通过会话传播状态消息 状态消息那些执行任务后生成消息。 ? 这样代码常见。使用变量来显示状态信息有一定局限性。...因为它们无法通过重定向发送(除非你将它们作为GET变量传播给下一个脚本,但这非常愚蠢)。而且在大型脚本中可能会有多个消息等。 最好办法使用会话来传播(即使在同一页面上)。...想要这样的话在每个页面上必须得有一个session_start。 ? 在你脚本中: ? 5.让函数变得灵活 ? 当添加单一条目时,使用上面的函数。那么当添加多个条目时,就得创建另一个函数

97220

40+个对初学者非常有用PHP技巧(一)

今天我们要介绍一些关于改善和优化PHP代码提示和技巧。请注意,这些PHP技巧适用于初学者,而不是那些已经在使用MVC框架的人。 ? 1.不要使用相对路径,要定义一个根路径 这样代码行常见: ?...不需要任何更多解释。 你还可以进一步改善: ? 这样做可以完成很多事情: 为同一个类文件搜索多个目录。 轻松更改包含类文件目录,而破坏任何地方代码。...在开发计算机上,你可以这样做: ? 并且在服务器上,你可以这样做: ? 4.通过会话传播状态消息 状态消息那些执行任务后生成消息。 ? 这样代码常见。使用变量来显示状态信息有一定局限性。...因为它们无法通过重定向发送(除非你将它们作为GET变量传播给下一个脚本,但这非常愚蠢)。而且在大型脚本中可能会有多个消息等。 最好办法使用会话来传播(即使在同一页面上)。...想要这样的话在每个页面上必须得有一个session_start。 ? 在你脚本中: ? 5.让函数变得灵活 ? 当添加单一条目时,使用上面的函数。那么当添加多个条目时,就得创建另一个函数

87530

Java反射

我们先把模型建立起来,如下图所示,小兵模型 ? 鲁班:你上次说了,业务代码时候要考虑通用性和可扩展性,但是这个功能也能用反射?...这里用反射获取到属性get 方法,然后调用get 方法获取属性值,和预期值做比较,这里 getReadMethod 方法为了方便说明做了简化,很多情况没写进入,比如属性boolean 类型,get方法前缀...鲁班:这二个方案都是判断 batman(小兵)身上带 rune(符文)是不是红色,如果是红色,就开火。但是新方案用了反射,有什么优势?...鲁班:你意思业务需求这么变,我用反射做了通用性功能,可以不需要重复写代码? 安琪拉: 对呀。到时候你可以抽更多时间来研究?技能。...鲁班:既然都说到这个份上了,能给段代码?干说练假把式 安琪拉: 好,如下图代码所示,这套带有规则反射可以应付来自产品各种花样需求了。 ? 鲁班:那规则表和条件表我都建在数据库

73020

面渣逆袭:Java集合连环三十问

大家好,我老三。上期发布了一篇:面渣逆袭:HashMap追魂二十三问,反响很好! 围观群众纷纷表示 不可能不,只有卷才能维持了生活这样子。...为什么最ArrayList直接序列化元素数组呢? 出于效率考虑,数组可能长度100,但实际只用了50,剩下50不用其实不用序列化,这样可以提高序列化和反序列化效率,还可以节省内存空间。...这样要快捷一些,但是新问题来了,就算散列值分布再松散,要是只取最后几位的话,碰撞也会很严重。如果散列本身做得不好,分布上成等差数列漏洞,如果正好让最后几个低位呈现规律性重复,那就更难搞了。...除此之外,还有这几种常见哈希函数构造方法: 直接定址法 直接根据key来映射到对应数组位置,例如1232放到下标1232位置。...valuevolatile,所以get不需要加锁

61420

从今天起让我们忘记Java中getset方法吧!

曾几何时,我们代码时候,每次Bean时候都会使用快捷键生成get/set方法,有时候我经常会想,既然每一个Bean我们都会给其提供get/set方法,那么为什么还有会这个东西哪?...一些思考 看到这里,很多人要说了,我使用要么SSM框架,要么SSH框架,这些框架都可以使用逆向工程方式生成我们代码,当然包括Bean,我们在使用逆向工程时候,get/set方法都是自动生成...使用这个Lombok尽管优美,我们还不是需要进行自己注解? 首先,我们先聊一下最近一个比较火领域驱动设计中贫血、失血、胀血和充血模型。 什么贫血失血充血模型呢?...图:领域驱动一种使用模式 因此对于一个充血模型领域驱动实体对象来说,他不但有属性还有他各种方法,如果整个都放在一个类里的话根本不好区分他到底get/set方法还是其他功能方法,这里我们使用Lombok...当然,我们也可以在开源项目的基础上进行修改这样的话更加容易一些!常见有mybatis-plus提供一个代码生成工具,可以参考!

46920

从今天起让我们忘记Java中getset方法吧!

曾几何时,我们代码时候,每次Bean时候都会使用快捷键生成get/set方法,有时候我经常会想,既然每一个Bean我们都会给其提供get/set方法,那么为什么还有会这个东西哪?...一些思考 看到这里,很多人要说了,我使用要么SSM框架,要么SSH框架,这些框架都可以使用逆向工程方式生成我们代码,当然包括Bean,我们在使用逆向工程时候,get/set方法都是自动生成...使用这个Lombok尽管优美,我们还不是需要进行自己注解? 首先,我们先聊一下最近一个比较火领域驱动设计中贫血、失血、胀血和充血模型。 什么贫血失血充血模型呢?...图:领域驱动一种使用模式 因此对于一个充血模型领域驱动实体对象来说,他不但有属性还有他各种方法,如果整个都放在一个类里的话根本不好区分他到底get/set方法还是其他功能方法,这里我们使用Lombok...等任何我们需要代码: 当然,我们也可以在开源项目的基础上进行修改这样的话更加容易一些!

3K91

不要再滥用可选链运算符(?.)啦!

,导致页面没有任何反应,js抛错,console也没有log,后续流程出错了,这时候如果想找原因就会很困难,对代码熟悉还行,如果不是自己就只能看代码捋逻辑,如果是生产环境压缩混淆了就更难排查了。...但并不是说一点都不用,意思尽量减少滥用,这样使用频率会少很多,这种编译代码沉余也会少不少。 应该怎么用? 说了这么多,.? 应该怎么用呢?意思不用?...,不要用; 某些方法或者组件里,参数和属性不允许是空值,那方法和组件里就不需要判断非空。...api.get(id).then(...) // 这个api如果id空值,则api会抛错 当然,代码时还得多想一下属性是否可能空值,会一定程度影响开发效率,也一定有开发会觉得很烦,不理解,无脑...想想在这个新特性出来之前大家怎么,会对每个变量和属性都加if非空判断或者用逻辑与(&&)?不会吧。 小结 本文以一个 code reviewer 角度,分析了 可选链运算符(?.)

23540

不要再滥用可选链运算符(?.)啦!

,导致页面没有任何反应,js抛错,console也没有log,后续流程出错了,这时候如果想找原因就会很困难,对代码熟悉还行,如果不是自己就只能看代码捋逻辑,如果是生产环境压缩混淆了就更难排查了。...但并不是说一点都不用,意思尽量减少滥用,这样使用频率会少很多,这种编译代码沉余也会少不少。 应该怎么用? 说了这么多,.? 应该怎么用呢?意思不用?...,不要用; 某些方法或者组件里,参数和属性不允许是空值,那方法和组件里就不需要判断非空。...api.get(id).then(...) // 这个api如果id空值,则api会抛错 当然,代码时还得多想一下属性是否可能空值,会一定程度影响开发效率,也一定有开发会觉得很烦,不理解,无脑...想想在这个新特性出来之前大家怎么,会对每个变量和属性都加if非空判断或者用逻辑与(&&)?不会吧。

23120

数字IC设计验证-秋招指南

最后重中之重,跨时钟域概念是什么,什么情况算跨时钟域,什么情况不算跨时钟域,跨时钟处理会发生什么,什么情况下可以处理,常见跨时钟域方法有哪些,快到慢,慢到快,多bit,单bit这些分别应该怎么处理...,这样容易在面试中落得下风,另一方面本身验证就是设计,设计就是验证,只是从不同角度去解读SPEC,对设计理解当然多多益善。...如何把接口传递到环境中 configdb机制作用是什么,如何使用,set以后一定要get?什么情况下可以get?...如果是转行同学,不要避讳专业,直接大大方方写出来,没有项目经历的话哪怕是自己做小模块也可以写上去,实在没有,培训班经历也可以。...set,在哪里get这样你从interface概念到动机到configdb再到使用方法,全都讲了一遍,拉高面试官对你印象。

1.4K21

Doug Lea在J.U.C包里面BUG又被网友发现了。

他说 FutureTask#isDone 方法现在这样: ? 他觉得从源码来看,只要当前状态不等于 NEW(即不等于0)则返回 true,表示任务完成。 ? 他觉得应该是这样: ?...但是吧,我也觉得我们在讨论一个非常细节,非常小问题,我不知道,就算现在这样,会导致任何问题?...标号为 ② 地方判断当前任务是否完成状态,如果是,则继续往下。 标号为 ③ 地方先中断当前线程,然后调用 get 方法获取任务结果。...他要表达意思,我理解这样: 在 j.u.c 包里面,优先检查线程中断状态常见操作,因为相对来说,会导致线程中断地方非常少。 但是不能因为少,我们就不检查了。...那个时候他主意就是:大佬都说了,这样考虑过,肯定没有问题。 现在他主意:如果 isDone 方法返回了 true,那么 get 方法应该明确返回结果值,而不会抛出 IE 异常。

63531

还有这种操作,可以让装饰器为所欲为?

今天Python专题第14篇文章,我们继续装饰器的话题,来看看怎么给装饰器包装方法,实现更多灵活操作。...不仅仅如此,类也一样可以通过setattr方法设置。 理解了setattr和getattr用法之后,我们不禁有一个问题,我们通过.操作,为什么还要搞一个setattr和getattr出来呢?...如果我们自己代码写着玩,当然用.操作更方便,但如果是实际开发场景。很有可能我们需要添加属性名称是从别的地方获取,而不是,也就是说是可配置。...最常见场景就是区分线上和测试环境,一种做法在接口名字之前加上一个标识,比如线上online,测试环境test或者dev。通过这种方法区分不同环境逻辑。...方法逻辑放入了装饰器当中,只要我们需要,我们还可以写出其他方法,来自定义我们对装饰器需求,而又不需要修改装饰器内部逻辑。

1.1K30

iOS 开发面试通关指南:67 个必知问题!

这没关系,没人会要求我们记住一切知识点……但如果是面试的话那就不一样了。 作为一名面试官,面试可能也不是那么简单。你想为公司招募一个非常适合你们团队的人,但你没有太多时间去了解对方。...我认为这并不是什么严肃问题——如果你不喜欢参加,并不能代表你一个糟糕开发者,你可能只是内向而已。但是,如果你可以在那种会议上为公司做宣传,或者发表个演讲的话,那公司喜闻乐见。...如果你Swift代码已经有一段时间了,那至少要使用过一次lazy property,这样才能更好地了解它优点和缺点。 11.什么optional?其背后机制是什么?...29.如何管理代码中依赖(dependency)?你使用依赖注入框架/工具,还是手动进行?或者你只使用单例(singleton)? 30.什么REST?POST和GET方法有什么区别?...这题不会也没关系,但是如果知道会加分! 35.如何允许不安全连接?这是可行?能通过应用审查?知道什么说什么就行——例如,可以谈谈在什么情况下可以做到这一点

1.1K20

新年 Flag 以及论坛一个所谓 Kotlin 不完全兼容 Java 问题

原帖结束 ---- 看到这个问题,突然觉得以前大家 Java 代码,得有多乱,人家明明就已经有了 message,你再继承,再搞出一个来,到底为什么呢。。。...题主说有可能第三方 SDK 这样,没有办法修改源码,怎么办? 当然去找到 SDK 开发者当面 diss 啊。...} 这个与绝大多数合成属性情况还不一样,如果是合成属性,通常我们也可以直接访问对应 get/set 方法。...实际上我们自己定义类如果继承存在 Kotlin 到 Java 映射关系类型,几乎不会遇到类似的问题。 3. 真的没有办法通过 Kotlin 实现访问?...这个访问过程实际上也没有什么额外开销,尽管看上去似乎用了反射,但根本不需要引入反射包,实际上也不会通过反射进行访问。

87110

MVP:Android guidelines

另外你需要面对常见Android问题如Activity生命周期,然后你还应该问问自己下面这些问题: 我应该保存presenter状态? 我应该将presenter做持久化处理?...在本文中,我将提供一系列准则或最佳做法,以便: 解决采用这个架构遇到常见问题(至少一些我遇到过) 发挥这个架构最大优势 首先,让我们先解释一下这个模式: ?...presenter用纯java代码实现两个理由:首先你要将具体实现抽象到presenter中,这样的话你就可以不依赖于设备测试代码了(甚至都不需要Robolectric),可以快速在你本地JVM...一些人认为应该一个Presenter接口因为你要将具体presenter和view解耦。 然而另外一些开发者认为你在抽象东西已经一个抽象了所以不需要再写一个接口了。...另外不管怎么样,有了一个接口后可以帮你方便mock presenter,不过如果你采用了Mockito这样工具类那么你就不需要接口了。

33730
领券