HashMap 几大问题
摘要:数组+链表+红黑树 ;如果链表存储超过了8个,那么会调用treeifyBin函数,将链表转换为红黑树。那么即使hashcode完全相同,由于红黑树的特点,查找某个特定元素,也只需要O(log n)的开销 ; 也就是说put/get的操作的时间复杂度最差只有O(log n)
阅读全文
JAVA多线程之AQS
摘要:AQS核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。
阅读全文
JAVA设计之SPI
摘要:SPI的全名为Service Provider Interface.大多数开发人员可能不熟悉,因为这个是针对厂商或者插件的。在java.util.ServiceLoader的文档里有比较详细的介绍。简单的总结下java spi机制的思想。我们系统里抽象的各个模块,往往有很多不同的实现方案,比如日志模块的方案,xml解析模块、jdbc模块的方案等。面向的对象的设计里,我们一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码。为了实现在模块装配的时候能不在程序里动态指明,这就需要一种服务发现机制。 java spi就是提供这样的一个机制:为某个接口寻找服务实现的机制。有点类似IOC的思想,就是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要。
阅读全文
JAVA多线程之线程池
摘要:缓存线程池,缓存的线程默认存活60秒。线程的核心池corePoolSize大小为0,核心池最大为Integer.MAX_VALUE,阻塞队列使用的是SynchronousQueue。是一个直接提交的阻塞队列, 他总会迫使线程池增加新的线程去执行新的任务。在没有任务执行时,当线程的空闲时间超过keepAliveTime(60秒),则工作线程将会终止被回收,当提交新任务时,如果没有空闲线程,则创建新线程执行任务,会导致一定的系统开销。如果同时又大量任务被提交,而且任务执行的时间不是特别快,那么线程池便会新增出等量的线程池处理任务,这很可能会很快耗尽系统的资源。
阅读全文
JAVA多线程之守护线程
摘要:守护线程:顾名思义,就是守护线程的线程;在JAVA线程分为 用户线程(User Thread)和守护线程(Daemon Thread) ;守护线程就是用来守护用户线程的。所以JVM中如果没有需要守护的线程了,守护线程也就没有存在的意义;守护线程最典型的应用就是 GC (垃圾回收器)。守护线程并非只有虚拟机内部提供,用户在编写程序时也可以自己设置守护线程
阅读全文
计算机网络之大小端模式
摘要:两个计算机系统之间通信,通过网络发送字节数据,双方必须为字节数据的顺序达成一致的协议,否则将无法对数据进行正确的解析,不同的计算机体系结构有不同的字节序,字节序可分为大端字节序(big-endian)和小端字节序(little-endian)。
阅读全文
JAVA字节码文件之第四篇(方法分析)
摘要:LineNumberTable 属性表存放方法的行号信息 ;属于调试信息,不是运行时必需的。在使用javac编译器编译Java程序时,默认会在class文件中生成这些信息。可以使用javac提供的-g:none选项来关闭该信息的生成
阅读全文
JAVA字节码文件之第三篇(访问标识)
摘要:Access Flags 占2个字节,所以该字节码文件的访问标志是00 21,0x0021在 Access Flags 中是0x0020和0x0001的并集,表示 ACC PUBLIC与 ACC SUPER合并的结果。说明该类的声明修饰是public并且继承Object
阅读全文
JAVA字节码文件之第二篇(常量池)
摘要:常量池(也称常量表):主版本号之后就是常量池的开始位置;java类所对应的常量池主要由常量池数量和常量池数组两部分组成,常量池数量是主版本号之后的两个字节;常量池数组在常量池数量之后,常量池数组中不同元素的类型,结构是不同的,所以该数组长度是不同的,但是数组中的每一种元素的第一个字节是标记位是一个u1类型,JVM在解析常量池时会根据这u1类型来获取元素的具体类型。
阅读全文
JAVA字节码文件之第一篇(结构)
摘要:魔数之后的四个字节是版本信息,前两个字节(00 00)是次版本号(minor version: 0),后两个字节(00 34)是主版本号(major version: 52),34是十六进制转换十进制为52;52对应的就是JDK1.8;所以该class文件的版本号=1.8.0;用过java -version 可以验证。由于JVM是向下兼容,所以如何你的字节码文件版本号,小于等于当前JVM的版本,都是可以在当前JVM中运行的。
阅读全文
JAVA的引用类型
摘要:在一个对象被垃圾回收器扫描到将要进行回收时,其相应的引用包装类,即reference对象会被放入其注册的引用队列queue中。可以从queue中获取到相应的对象信息,同时进行额外的处理。比如反向操作,数据清理,资源释放等。
阅读全文