前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用Unsafe获取数组某个特定下标的内容

使用Unsafe获取数组某个特定下标的内容

作者头像
gzq大数据
发布于 2022-05-11 03:43:46
发布于 2022-05-11 03:43:46
97100
代码可运行
举报
文章被收录于专栏:大数据那些事大数据那些事
运行总次数:0
代码可运行

看ForkJoin源码的时候,发现了一个有趣的用法,在每一个WorkQueue里面都有一个array来存放任务,如果要取一个具体的任务,首先这个array的长度一定是2的次幂,这时候就可以用unsafe里的arrayBaseOffset获取到第一个元素的偏移地址,然后和arrayIndexScale(获取数组里每一个元素的大小)联合使用便可以获得某一个下标的具体位置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
long i = (((a.length - 1) & b) << ASHIFT) + ABASE;

这里((a.length - 1) & b)就是下标索引,大家可以试试如果保证a.length是2的次幂,b是某个具体下标,这样的操作就是下标索引,ASHIFT其实就是2的几次方,ASHIFT是通过如下算法算出来的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ASHIFT = 31 - Integer.numberOfLeadingZeros(scale);

这样如果是4,算出来的就是2,*4和左移2是一样的效果。最后再加上ABASE即可。 当然我们也可以通过:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
long i = ABASE+scale*b(具体下标)

但是大佬们一般都喜欢用位运算的方式使代码更快。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
java线程池(六):ForkJoinPool源码分析之二(WorkQueue源码)
在前面介绍了ForkJoinPool的骨架源码之后,我们来看看ForkJoinPool的核心组成。WorkQueue的源码。
冬天里的懒猫
2020/09/28
8140
java线程池(六):ForkJoinPool源码分析之二(WorkQueue源码)
万字图文——ConcurrentHashMap源码深度解析
本次ConcurrentHashMap的源码解析是针对JDK8,内容比较多,具体大纲请见下方截图:
爪哇缪斯
2023/05/10
7310
万字图文——ConcurrentHashMap源码深度解析
Unsafe 源码分析
Unsafe 是用于在实质上扩展 Java 语言表达能力、便于在 Java 代码里实现原本要在 C 层实现的核心库功能用的。这些功能包括裸内存的申请、释放、访问,低层硬件的 atomic/volatile 支持,创建未初始化对象等。但由于 Unsafe 类使 Java 语言拥有不应该暴露的骚操作,增加了程序出问题的风险。
itliusir
2020/01/31
9690
ConcurrentHashMap源码分析(JDK8版本)
ConcurrentHashMap是conccurrent家族中的一个类,由于它可以高效地支持并发操作,以及被广泛使用,经典的开源框架Spring的底层数据结构就是使用ConcurrentHashMap实现的。与同是线程安全的老大哥HashTable相比,它已经更胜一筹,因此它的锁更加细化,而不是像HashTable一样为几乎每个方法都添加了synchronized锁,这样的锁无疑会影响到性能。
全栈程序员站长
2022/09/12
3750
ConcurrentHashMap源码分析(JDK8版本)
我是这样给阿里面试官吹 ConcurrentHashMap的
因为上篇文章HashMap已经讲解的很详细了,因此此篇文章会简单介绍思路,再学习并发HashMap就简单很多了,上一篇文章中我们最终知道HashMap是线程不安全的,因此在老版本JDK中提供了HashTable来实现多线程级别的,改变之处重要有以下几点。
浅羽技术
2020/12/07
8080
我是这样给阿里面试官吹 ConcurrentHashMap的
​Java Map中那些巧妙的设计
最近拜读了一些Java Map的相关源码,不得不惊叹于JDK开发者们的鬼斧神工。他山之石可以攻玉,这些巧妙的设计思想非常有借鉴价值,可谓是最佳实践。然而,大多数有关Java Map原理的科普类文章都是专注于“点”,并没有连成“线”,甚至形成“网状结构”。因此,本文基于个人理解,对所阅读的部分源码进行了分类与总结,归纳出Map中的几个核心特性,包括:自动扩容、初始化与懒加载、哈希计算、位运算与并发,并结合源码进行深入讲解,希望看完本文的你也能从中获取到些许收获(本文默认采用JDK1.8中的HashMap)。
曲水流觞
2021/06/15
6780
​Java Map中那些巧妙的设计
JDK 7 ConcurrentHashMap源码解读
HashMap存在并发问题,jdk有提供HashTable,这个HashTable是对HashMap中的所以方法加锁以达到线程安全,但是,这种方式会使得性能下降,看下面的图,假如有两个线程分别要put kk3和kk4,第一个线程最快,它对kk3进行put操作,这时另一个线程要put kk4就要等待,问题是,这两个元素所要put的位置,互不相干,但还是需要等待,这造成了一种资源浪费,所以才会出现ConcurrentHashMap,它分段式加锁,就能很大程度上避免下面的情况。
用针戳左手中指指头
2021/01/29
3620
JDK 7 ConcurrentHashMap源码解读
CurrentHashMap原理从7到8
HashMap在并发执行put会引起死循环,是因为多线程会导致HashMap的Entry链表成环,一旦成环,Entry的next节点永远不为空,产生死循环 而
JavaEdge
2018/05/16
4.7K1
聊聊 Java 中的 Unsafe 类
哈喽,我是狗哥。Unsafe 类位于 rt.jar 包,Unsafe 类提供了硬件级别的原子操作,类中的方法都是 native 方法,它们使用 JNI 的方式访问本地 C++ 实现库。由此提供了一些绕开 JVM 的更底层功能,可以提高程序效率。
JavaFish
2022/01/17
6610
聊聊 Java 中的 Unsafe 类
Java高并发之无锁与Atomic源码分析
目录 CAS原理 AtomicInteger Unsafe AtomicReference AtomicStampedReference AtomicIntegerArray AtomicIntegerFieldUpdater 无锁的Vector 无锁即无障碍的运行, 所有线程都可以到达临界区, 接近于无等待. 无锁采用CAS(compare and swap)算法来处理线程冲突, 其原理如下 CAS原理 CAS包含3个参数CAS(V,E,N).V表示要更新的变量, E表示预期值, N表示新值. 仅当V值等
用户1216491
2018/05/28
5590
AQS-Exchanger源码学习
上文:AQS-semaphore&CyclicBarrier&CountDownLatch源码学习
逍遥壮士
2023/02/28
2040
AQS-Exchanger源码学习
java线程池(五):ForkJoinPool源码分析之一(外部提交及worker执行过程)
在前文中介绍了如何使用ForkJoinPool和ForkJoin的一些基本原理。现在继续来分析ForkJoin,原本计划从源码开始分析。但是ForkJoinPool的源码太过复杂。后续得分好几部分来讲解。今天先做一个总体的介绍。
冬天里的懒猫
2020/09/27
2.8K0
java线程池(五):ForkJoinPool源码分析之一(外部提交及worker执行过程)
JUC之Unsafe类
Java 不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe 类提供了硬件级别的原子操作。Unsafe 类使用 private 修饰构造方法,只能使用他自己提供的一个 final 类来进行获取。
小四的技术之旅
2022/07/26
8470
java的unsafe_java安全设置
前段时间因为看JUC的源码,里面有大量关于unsafe的操作,所以就来看看了.写点笔记总结下(本文基于jdk1.8):
全栈程序员站长
2022/11/01
4160
Java 8 ConcurrentHashMap源码中竟然隐藏着两个BUG
Java 7的ConcurrenHashMap的源码我建议大家都看看,那个版本的源码就是Java多线程编程的教科书。在Java 7的源码中,作者对悲观锁的使用非常谨慎,大多都转换为自旋锁加volatile获得相同的语义,即使最后迫不得已要用,作者也会通过各种技巧减少锁的临界区。在上一篇文章中我们也有讲到,自旋锁在临界区比较小的时候是一个较优的选择是因为它避免了线程由于阻塞而切换上下文,但本质上它也是个锁,在自旋等待期间只有一个线程能进入临界区,其他线程只会自旋消耗CPU的时间片。Java 8中ConcurrentHashMap的实现通过一些巧妙的设计和技巧,避开了自旋锁的局限,提供了更高的并发性能。如果说Java 7版本的源码是在教我们如何将悲观锁转换为自旋锁,那么在Java 8中我们甚至可以看到如何将自旋锁转换为无锁的方法和技巧。
码农架构
2021/05/08
8450
Java 8 ConcurrentHashMap源码中竟然隐藏着两个BUG
ForkJoinPool使用及原理
Fork/Join 框架是 Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。
leobhao
2022/06/28
1.1K0
ForkJoinPool使用及原理
Conccrent中 Unsafe类原理 以及 原子类AutomicXX的原理以及对Unsafe类的使用
Java中基于操作系统级别的原子操作类sun.misc.Unsafe,它是Java中对大多数锁机制实现的最基础类。请注意,JDK 1.8和之前JDK版本的中sun.misc.Unsafe类可提供的方法有较大的变化,本文基于JDK 1.8。sun.misc.Unsafe类提供的原子操作基于操作系统直接对CPU进行操作,而以下这些方法又是sun.misc.Unsafe类中经常被使用的:
小勇DW3
2018/08/30
8710
Conccrent中 Unsafe类原理 以及 原子类AutomicXX的原理以及对Unsafe类的使用
在openjdk8下看Unsafe源码
尽管有传言JAVA9可能会移除Unsafe类,但不妨碍我们理解它的原理。因为类不在了,native方法还在那里。就像菜换样了,食材就那些没变。一个好厨师不仅仅需要会做菜,还需要能识别食材特性...来吧,直接上干货。
凯哥Java
2022/12/16
4290
还有年味的文章,ForkJoinPool 大型图文现场
并发工具类我们已经讲了很多,这些工具类的「目标」是让我们只关注任务本身,并且忽视线程间合作细节,简化了并发编程难度的同时,也增加了很多安全性。工具类的对使用者的「目标」虽然一致,但每一个工具类本身都有它独特的应用场景,比如:
用户4172423
2021/02/25
6930
还有年味的文章,ForkJoinPool 大型图文现场
【死磕Java并发】—–J.U.C之并发工具类:Exchanger
前面三篇博客分别介绍了CyclicBarrier、CountDownLatch、Semaphore,现在介绍并发工具类中的最后一个Exchange。Exchange是最简单的也是最复杂的,简单在于API非常简单,就一个构造方法和两个exchange()方法,最复杂在于它的实现是最复杂的(反正我是看晕了的)。 在API是这么介绍的:可以在对中对元素进行配对和交换的线程的同步点。每个线程将条目上的某个方法呈现给 exchange 方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象。Exchanger 可能被
用户1655470
2018/04/26
8390
相关推荐
java线程池(六):ForkJoinPool源码分析之二(WorkQueue源码)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验