The DEV Lyrics.

Thinking will not overcome fear but action will.

JVM-class文件解析

通过简单 demo 来解析 class 文件

1. Class 文件基本结构 1.1 常量池结构 ClassFile { u4 magic; u2 minor_version; u2 major_version; u2 constant_pool_count; cp_info constant_...

requestLayout、invalidate、postInvalidate 原理

从源码角度讲解

概述 requestLayout:会触发三大流程。 invalidate:触发 onDraw 流程,在 UI 线程调用。 postInvalidate:触发 onDraw 流程,在非 UI 线程中调用。 requestLayout 直接来看 View 中的 requestLayout 流程: public void requestLayout() { ...

Handler 源码解析

从源码角度讲解 Handler、MessageQueue、Looper

我们知道 Handler 可以发送2中消息:同步消息、异步消息。他们在处理方式上没有区别,只有当设置了同步屏障才会出现差异。 Handler 同步屏障 // MessageQueue.java public int postSyncBarrier() { return postSyncBarrier(SystemClock.uptimeMillis()); ...

java 并发

解析 Selector 源码

原子操作实现原理和 CAS 原子操作可以通过2种方式实现: 锁:保证只有获得锁的线程才能操作锁定的内存区域 循环 CAS 有了锁机制为什么还需要 CAS 机制? 多线程竞争下,加锁和释放锁会导致比较多的上下文切换和调度延时 ,引起性能问题 一个线程持有锁会导致其它所有需要此锁的线程挂起 若优先级高的线程等待优先级低的线程释放锁,会导致优先级导致,引起性能风险。 ...

NIO-Selector

解析 Selector 源码

Sample selector = Selector.open(); ServerSocketChannel ssc = ServerSocketChannel.open(); ssc.configureBlocking(false); ssc.socket().bind(new InetSocketAddress(port)); ssc.register(sel...

NIO

NIO 与 IO 的区别,以及基本用法

NIO 即 New IO,也叫 Non-blocking IO,非阻塞 IO。程序员无需写自定义的 native 代码就能实现高速的 I/O。NIO 将最耗时的操作(如往缓存中填充和从缓存中读出数据)移到操作系统中,从而达到极大的提速效果。它通过定义类来 hold 数据,并以块为单位来处理数据。 Identifying differences between IO and NIO IO s...

InputStreamReader

看看字节流是如何转化为字符流的

InputStreamReader 用于将字节流转换成字符流,看之前以为是读取2个字节,然后第一个字节往左移8位,然后与第二个字节相加,得到一个2字节的 int,然后强制转换成 char。但看到构造函数中传 Decoder 就知道没这么简单。所以这里来分析下。 InputStreamReader public class InputStreamReader extends Reader {...

ObjectOutputStream

主要讲解 Serializable 是如何通过 ObjectOutputStream 进行序列化

引言 ObjectOutputStream 是序列化的关键类,用于将对象转化为二进制流。可以通过 ObjectInputStream 将二进制流还原成对象。序列化是需要注意以下几点: 要序列化的类须实现 Serializable 接口 反序列化后的类的 serialVersionUID 和对象二进制流的 serialVersionUID 必须相同 序列化会把类的引用中所有的成员...

I/O

主要总结以下常见 I/O 的作用和要点

最下面的引用里面的文章讲的很好很全,将全套的 Java IO 流的源码都讲了一遍,我这里仅仅梳理下个人觉得比较重要的知识。 分类 字节流:以字节为单位,每次次读入或读出是8位数据。可以读任何类型数据。 字符流:以字符为单位,每次次读入或读出是16位数据。其只能读取字符类型数据。 无论是字节流还是字符流,都分为输入流和输出流: 输入流:从文件读入到内存 输出流:从内存...

String

主要讲解和 String 相关的要点

Java String类为什么是final的? 为了实现字符串常量池 为了线程安全 为了 String 的 HashCode 的不可变性 首先我们要了解 final 的用途。他可以修饰类、方法和变量。修饰类表示该类不可继承,修饰方法表示方法不能被重写,修饰变量(无论是类属性、对象属性、形参还是局部变量)则变量必须进行初始化操作,并且该变量不可变。 用 final 来修饰...