开始进入HashMap前,先了解一下知识,这样才能更好的理解源码。 开始前预习 关于二叉树的知识点摘自:https://www.jianshu.com/p/bf73c8d50dc2 推荐看原文;树的相关知识只作为回顾,不会详细说明。 源码 红黑树源码 上边我们从原理和实例上了解了红黑树,现在从源码级别来看看他的一个流程,HashMap的插入有使用到红黑树,所以,了解了红黑树,再去看效果会更好。 HashMap 源码 JDK7和8有这样一些区别: 在hash上的计算,8 的没有7 的复杂,原因可能就是在8里面引入了红黑树,已经将插入读取的效率提高了,再在下标上下功夫没有多大用处了。 0 : (h = key.hashCode()) ^ (h >>> 16); } 8里的内部数组数组类型是Node,7里面是Entry 8里面链表是尾插法,7是头插法 final V
7和8 的结构还是有些不一样;7里面是Segment、entry数组实现的,将entry数组分段加锁,而8里是对数组元素加锁,并发上增加了一个counterCells的数组记录并发时增加的值,然后通过cas = sc; } break; } } return tab; } jdk8中没有
检查当前时间是否超过汇报时间检测,如果是,则汇报当前状态 6)当所有的执行完成从while中退出之后,再次全局汇报当前的任务状态 ---- 二、主要方法 三、主入口start的时序图 ---- 四、源码解读 writerThread.isAlive(); } } } 注: 对源码进行略微改动,主要修改为 1 阿里代码规约扫描出来的,2 clean code; 所有代码都已经上传到github
p.next = newNode(hash, key, value, null); // TREEIFY_THRESHOLD 为 8, 如果没有碰撞,直接放入桶中(碰撞的意思是计算得到的 Hash 值相同,需要放到同一个 bucket 中) 如果碰撞了,以链表的方式链接到后面 如果链表长度超过阀值(TREEIFY THRESHOLD==8)
34B66A6E-F3C7-4D02-A508-14F271CD3445.png A6A6A7B1-1CC9-4820-9F87-D513CA85F93C.png 48C9C055-75B4-4B0B-9D82-8F8A699AA1C1
二、源码解析 Looper源码解析 Android应用程序进程在启动的时候,会在线程中加载 /frameworks/base/core/java/android/app/ActivityThread.java next源码 Message next() { final long ptr = mPtr; ............... nativePollOnce(ptr, nextPollTimeoutMillis);【内部源码这里就先暂时不看了,有机会以后再看看】 当nextPollTimeoutMillis=-1时,表示没有消息 Looper大致就这些,下面看下Handler Handler源码解析 无限循环遍历MessageQueue过程就这些,上面讲了如何获取Message以及MessageQueue如何阻塞的。 dispatchMessage源码 public void dispatchMessage(@NonNull Message msg) { if (msg.callback !
一.Launcher通过Binder进程间通信机制通知ActivityManagerService,它要启动一个Activity;
(最短栈、最长栈) private[spark] case class CallSite(shortForm: String, longForm: String) 源码中通过「getCallSite( )」 方法配置返回CallSite 参数示意: 参数英文名 参数含义 lastSparkMethod 方法存入 firstUserFile 类名存入 firstUserLine 行号存入 源码如下:
metricsSystem, memoryManager, outputCommitCoordinator, conf) 总结 Spark Env 源码顺序大致就是上面的流程 ,更细致的后面的博文中会持续更新解读。
异步事件列队主要由LinkedBlockingQueue[SparkListenerEvent] 构建,默认大小为10000
1.直接看下setContentVIew源码 activity.java public void setContentView(@LayoutRes int layoutResID) { getWindow ().setContentView(layoutResID);// initWindowDecorActionBar(); } 1.在activity.java源码中我们可以看到 mWindow = new PhoneWindow(this, window, activityConfigCallback);所以我们直接看PhoneWindow源码中的setContentView。
前言 对于Android开发者来说,View无疑是开发中经常接触的,包括它的事件分发机制、测量、布局、绘制流程等,如果要自定义一个View,那么应该对以上流程有所了解、研究。 以下源码均取自Android API 21。 Activity中,会在onCreate()方法中写下这样一句: setContentView(R.layout.main); 显然,这是为activity设置一个我们定义好的main.xml布局,我们跟踪一下源码 尝试追踪一下源码,发现mWindow是Window类型的,但是它是一个抽象类,setContentView也是抽象方法,所以我们要找到Window类的实现类才行。 mContentRoot = (ViewGroup) in; ViewGroup contentParent = (ViewGroup)findViewById(ID_ANDROID_CONTENT
处理消息 整体的流程有了,但是一直没有结合源码捋一捋。 这才去翻了翻源码,今天总结一下。 Android 消息机制主要涉及 4 个类: Message MessageQueue Handler Looper 我们依次结合源码分析一下。 /os/messagequeue.html#0dbba2b975383e8b440199e5d69c73de Looper.loop() 方法: public static void loop( 这篇文章暂不研究 Native 层源码。 这篇文章结合源码完整的看了一遍 Message MessageQueue Handler Looper,现在看着上面的图,可以自信地说我“熟悉 Android 消息机制”了哈哈。
前言 HashMap是平时开发中非常常用的一个集合框架类,了解其内部构造及运行原理可以说是每一个Java程序员必不可少的,接下来就从源码一探究竟HashMap到底是什么样的类。 话不多说,接下来就直接进入源码解析部分吧 二、HashMap源码解读 温馨提示:阅读需耐心哦~~ 1. KeySet、Values、EntrySet、HashIterator等,因为本文仅涉及增删改查操作,Node类、TreeNode类是其中操作的主要类,但是由于红黑树较为复杂,不是本文的重点,所以这里暂只解读 extends V> m) { putMapEntries(m, true); } 8. 源码解读文章,和大家一起学习一下它在HashMap的基础上又进行了哪些优化。
众所周知,我昨天买了个遥控器->Tiny X8M遥控器全解,文章在此。不过这个是开源的,代码就写的好,不读可惜了,读它。 一共有两套,8D和16D的协议,先看8D的。 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16 注意是一个1x420的数组 startUp这个有点像是一个初始化得方法 这是里面的一段关于摇杆采集发送的代码 这是在这个包里面所有的方法 按道理其实我还应该继续往下读,但是我觉得这个menu的源码很有趣 这块有点像实现了一个自己的协议,但是很简陋的亚子 通过 USART 外设传输 8 位数据。 最终发的是灯的状态 这个灯的闪烁在这里 uint8_t LED_Status_SendDat = 0; 然后这个LED的是一个8位的无符号的变量 这就是注释说的,如果无效就保持自己的状态。
NETD 一、NETD解读 1.1、NETD的作用 Netd是Android系统中专门负责网络管理和控制的后台daemon程序,其功能主要分三大块: 设置防火墙(Firewall)、网络地址转换(NAT Android系统中DNS信息的缓存和管理。 Netd位于Framework层和Kernel层之间,它是Android系统中网络相关消息和命令转发及处理的中枢模块。 setenv("ANDROID_DNS_MODE", "local", 1); //创建DnsProxyListener,它将创建名为"dnsproxyd"的监听socket dpl = strcmp(argv[2],"enable")); return sendGenericOkFail(cli, res); } 二、iptable解读 2.1、iptable原理
你能通过源码看见 Row 和 Column 都继承了 Flex ,布局具体的计算都在这个类中,我们可以通过源码 github.com/flutter/flut 了解一下 Flex 是如何计算布局的。 const <Widget>[], }) 基本上默认值的设计不管是 Row 还是 Column 都遵循了 Flex 的设计,唯一相比之下只有 this.direction 参数是多余出来的一个,通过源码的注释我们可以了解到它是用于设置轴的排列方向
Hosts)) } if common.Scantype == "icmp" { common.LogWG.Wait() return } common.GC() CheckLive函数(源码解读在 其它情况则调用PortScan函数(源码解读在portscan.go中)扫描存活的端口。LogWG.Wait()会等待PortScan函数中的goroutine执行完毕后,再执行后面的代码。
AbstractQueuedSynchronizer关键属性 下面来看看acquire获取锁的部分源码: public abstract class AbstractQueuedSynchronizer 源码如下: abstract static class Sync extends AbstractQueuedSynchronizer { //非公平锁最终最调用到当前这个方法,传入的acquires 源码如下: //这个方法是不允许子类重写的 final boolean acquireQueued(final Node node, int arg) { boolean failed 下面再来看看释放锁的逻辑AbstractQueuedSynchronizer的relase源码如下: //释放锁需要调用release方法 public final boolean release
二、源码解读 现在我们有了 head 和 tail 节点,如果按照我们平常的思维,head 节点即头节点,tail 节点即尾节点。 想要读懂 ConcurrentLinkedQueue 的源码,最好先搞懂以下特质: 队列中任意时刻只有最后一个元素的 next 为 null head 和 tail 不会是 null(哨兵节点的设计)