生活工程体验信仰哲学精神
投稿投诉
精神世界
探索历史
哲学文学
艺术价值
信仰创造
境界审美
体验技术
技能工具
工程信息
医学生产
生活运用
操作能力

真实字节二面什么是伪共享?

11月11日 虎狼旗投稿
  这个问题来自最近一个朋友字节面试碰到的,最后他也成功拿到了字节offer,这个问题我想可能挺多人不太清楚,所以想拿出来单独说一说。
  好了,让我们进入正题。什么是伪共享
  首先大家都知道,随着CPU和内存的发展速度差异的问题,导致CPU的速度远远快于内存,所以一般现在的CPU都加入了高速缓存,就是常说的解决不同硬件之间的性能差异问题。
  这样的话,很简单的道理,加入了缓存,就必然会导致缓存一致性的问题,由此,又引入了缓存一致性协议。(如果你不知道,建议去百度一下,这里不做展开)
  CPU缓存,顾名思义,越贴近CPU的缓存速度越快,容量越小,造价成本也越高,而高速缓存一般可以分为L1、L2、L3三级缓存,按照性能的划分:L1L2L3。
  而事实上,数据在缓存内部都是按照行来存储的,这就叫做缓存行。缓存行一般都是2的整数幂个字节,一般来说范围在32256个字节之间,现在最为常见的缓存行的大小在64个字节。
  所以,按照这个存储方式,缓存中的数据并不是一个个单独的变量的存储方式,而是多个变量会放到一行中。
  我们常说的一个例子就是数组和链表,数组的内存地址是连续的,当我们去读取数组中的元素时,CPU会把数组中后续的若干个元素也加载到缓存中,以此提高效率,但是链表则不会,也就是说,内存地址连续的变量才有可能被放到一个缓存行中。
  在多个线程并发修改一个缓存行中的多个变量时,由于只能同时有一个线程去操作缓存行,将会导致性能的下降,这个问题就称之为伪共享。
  为什么只有一个线程能去操作?我们举个实际的栗子来说明这种情况:
  假设缓存中有x,y两个变量,他们同时已经在不同的三级缓存之中。
  这时有两个线程A和B同时去修改位于Core1和Core2的变量x和y。
  如果线程A去修改Core1的缓存中的x变量,由于缓存一致性协议,Core2中对应的缓存了x变量的缓存行将会失效,他会被强制从主内存中重新去加载变量。
  这样的话,频繁的访问主内存,缓存基本都失效了,将会导致性能的下降,这就是伪共享的问题。
  如何避免?
  既然已经知道了什么是伪共享,那么怎么避免这种情况的发生?
  改变行存储的方式?想都别想了。
  剩下可行的方法就是填充,如果这一行只有我这一个数据那不就好了吗?
  确实就是这样,解决方式通常有以下两种。
  字节填充
  在JDK8之前,可以通过填充字节的方式来避免伪共享的问题,如下代码所示:
  自定义填充
  一般而言,缓存行有64字节,我们知道一个long是8个字节,填充5个long之后,一共就是48个字节。
  而Java中对象头在32位系统下占用8个字节,64位系统下占用16个字节,这样填充5个long型即可填满64字节,也就是一个缓存行。
  Contented注解
  JDK8以及之后的版本Java提供了sun。misc。Contended注解,通过Contented注解就可以解决伪共享的问题。
  注解方式
  使用Contented注解后会增加128字节的padding,并且需要开启XX:RestrictContended选项后才能生效。
  所以,通过以上两种方式你会发现,对象头大小和缓存行的大小都和操作系统位数有关,JDK的注解帮你解决了这个问题,所以推荐尽量使用注解的方式来实现。
  虽然解决了伪共享问题,但是这种填充的方式也浪费了缓存资源,明明只有8B的大小,硬是使用了64B缓存空间,造成了缓存资源的浪费。
  而且我们知道,缓存又小又贵,时间和空间的取舍要自己酌情考虑。实际应用
  在Java中提供了多个原子变量的操作类,就是比如AtomicLong、AtomicInteger这些,通过CAS的方式去更新变量,但是失败会无限自旋尝试,导致CPU资源的浪费。
  为了解决高并发下的这个缺点,JDK8中新增了LongAdder类,他的使用就是对解决伪共享的实际应用。
  LongAdder继承自Striped64,内部维护了一个Cell数组,核心思想就是把单个变量的竞争拆分,多线程下如果一个Cell竞争失败,转而去其他Cell再次CAS重试。
  Striped64成员变量
  解决伪共享的真正的核心就在Cell数组,可以看到,Cell数组使用了Contented注解。
  在上面我们提到数组的内存地址都是连续的,所以数组内的元素经常会被放入一个缓存行,这样的话就会带来伪共享的问题,影响性能。
  这里使用Contented进行填充,就避免了伪共享的问题,使得数组中的元素不再共享一个缓存行。
  好了,今天的内容就到这里,我是艾小仙,我的slogan还没想好,但是我们下次见。
  后台回复【pdf】获取百本计算机电子书和大厂面试精华,文章每周持续更新。我是艾小仙,阿里巴巴技术专家,我们下期见!
  面经PDF整理
投诉 评论 转载

十大实力派男歌手,台湾50后排名,谁的唱功最好上世纪八九十年代,内地娱乐圈刚开始发展,大众最喜欢听的音乐呢,一般还是港台音乐,而这其中尤以台湾歌手数量最多,今天通过数据,盘点出十大台湾男歌手。第十名赵传赵传19……在日本很受欢迎,但在其他国家却难以接受的9个恶搞节目日本是一个很奇怪的国家,为什么这么说?因为他们给外界的感觉,通常是工作一丝不苟,非常的尽职尽责,同时还具有很高的创造力,但是与此相反的,日本的一些恶搞电视节目,却又展现出了不同……心理学家想知道身边的人是否讨厌你,看这5个细节就够了千里难寻是朋友,朋友多了路好走每次听到这首歌,关于朋友的美好回忆就会出现在眼前。真正的朋友,是那种和你肝胆相照,对你掏心掏肺,愿意拉你一起走出困境奔向美好生活的人。不管什……再不看就没了!最后一场电影给这部9分神作吧太惨了。在欧美,作为迪士尼的牌面,皮克斯每年出品的动画上映都是惊天动地的大事。然而口碑再好的作品一到中国,就前途未卜。这次的《心灵奇旅》在豆瓣的评分高达9。1……相似度足有9成的明星,若互为替身,相信一定能以假乱真相似度足有9成的明星,若互为替身,相信一定能以假乱真。演艺圈特型演员的存在,就表明这个世界上有很多人的长相,是十分相似的。而单单放眼整个明星圈,就会发现长得相像的明星,其……刘诗诗牡丹花间拍摄大片,又美又华丽宛如画中仙最近刘诗诗为知名杂志拍摄封面,在牡丹花海中的刘诗诗变换各种姿势,一改之前的淡雅造型,华丽变身花中仙子,惊艳又时尚。第一套:粉色吊带裙浪漫优美,大大的花朵状裙摆铺在花瓣上,……真实字节二面什么是伪共享?这个问题来自最近一个朋友字节面试碰到的,最后他也成功拿到了字节offer,这个问题我想可能挺多人不太清楚,所以想拿出来单独说一说。好了,让我们进入正题。什么是伪共享……65岁张丰毅和55岁李若彤健身合体,自律运动,才是最好的保养人们常说,运动是最好的保养品!一直保持健身习惯的人无论从气质还是外形上,一般都会比同龄人看上去更年轻更有活力。5月14日,姑姑李若彤在社交媒体上晒了一组跟元老级影视演员张……早晨跑步,上午工作,下午训练,带队冲进12强的李铁心情大好主帅李铁带领国足队员干净利落脆的先后20菲律宾、50马尔代夫,最终以31的比分战胜了宿主叙利亚,成功挺进12强赛,向着世界杯又迈出了一大步。火车跑得快,全靠车头带。国足能……由于自卑不敢露面,西瓜视频帮助大白话摘下了狗头套虽然通过短视频从事着自己热爱的电影解说事业,但大白话本人却从在视频中不露面,一直戴着标志性的狗头套。作为一名拥有548万粉丝的电影解说,他戴着狗头套不是因为不想提高知名度,而是……刘谦魔术手速VS超高速摄影机,网友看傻慢镜头才看出刘谦有多强台湾魔术师刘谦,他的一句接下来,就是见证奇迹的时刻,变成流行用语。近期一名网红Tim和刘谦合作,还特地用超高速摄影机拍下他变魔术瞬间,事后重看多次甚至得放慢40倍速,才得以用肉……如懿传皇帝的两大忠粉,意欢就像迷妹,而她佛系追星活到最后虽然如懿传中我们的华哥拿到的乾隆剧本实在是有些渣,但是作为一位大清帝王,我们的乾隆皇帝也是拥有死忠粉的好吗?如懿传中乾隆拥有两大死忠粉,一位是已经下线了的舒妃娘娘,叶赫那拉意欢……
青春不过几届世界杯,遥望明年今日欧洲杯惊慌!误入修脚店怎么办?南京大逃杀,祸害扬州城,毛老太惹上事儿了吴亦凡被刑拘,青簪行播出无望,合作演员杨紫卖惨被骂梁洁奇遇如戏也如诗得罪师父还是野心太大?红透半边天的小沈阳为何销声匿迹?1994年,巩俐对关之琳进行降维式打压,连梁朝伟劝和都没用另一个拉姆为爱远嫁却遭受家暴,危险的隐忍换不来尊重搞小团体?侯佩岑生日直呼很幸福,却只晒三人姐妹照无大小S身影tfboys即将解散?经纪公司紧急发声明,部分粉丝却在狂欢正常喝酒,肯定有搂抱个屁!阿里丑闻讨论不该止于酒桌文化双面胶李亚平母亲她的双标,害惨了儿媳妇胡丽娟全国创新大赛之旅行政复议结果出来多久可以诉讼女孩恋爱心理的发展历程引入社群概念我们再看社区和社交数学造句用数学造句大全印度政府被曝又要以所谓安全威胁为由,禁用54款中国应用程序李沁很会穿,外套叠穿够洋气,独创上肿下细穿法很显瘦呼吸机会造成肺炎吗有点欠收拾的爆笑小屁孩渴望努力我的科技梦美国最亲华的总统!称中国为第二故乡,清华专门为他建纪念馆?

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找