摘要:
Binary Search Sort Arrays中的排序算法较多,有legacyMergeSort(),mergeSort(),sort()。sort()方法针对不同的参数也有不同的实现方法,如果参数是基本类型数组,则使用DualPivotQuicksort中的sort方法排序,如果参数是自定义类 阅读全文
摘要:
TreeMap 是一个有序的key-value集合,它是通过 红黑树 实现的。 TreeMap 继承于AbstractMap,所以它是一个Map,即一个key-value集合。 TreeMap 实现了NavigableMap,Cloneable和Serializable接口。 TreeMap的基本操 阅读全文
摘要:
ThreadPoolExecutor继承自 AbstractExecutorService。AbstractExecutorService实现了 ExecutorService 接口。 顾名思义,线程池就是保存一系列线程的“容器”。 在ThreadPoolExecutor的实现中,将这些线程保存在一 阅读全文
摘要:
AbstractExecutorService是一个实现了ExecutorService的抽象类。主要实现了ExecutorService的invoke方法。 阅读全文
摘要:
先看一个Executor接口,该接口只有一个方法:void execute(Runnable command),用于在未来某个时刻提交一个command,这个command可以被提交到一个新的线程,或者一个线程池,或者在调用线程中。 ExecutorService接口继承了Executor接口。主要 阅读全文
摘要:
Executors包含一系列静态方法,可以用于构建线程池。 返回实现了 ExecutorService 接口的对象: newCachedThreadPool newFixedThreadPool(int threads) newSingleThreadPool 返回实现了ScheduledExecu 阅读全文
摘要:
1.意图 将抽象部分与它的实现部分分离,使它们都可以独立地变化。 阅读全文
摘要:
1.意图 将一个类的接口转换成客户希望的另一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。2.结构 类适配器 对象适配器 3.参与者Target定义Client使用的与特定领域相关的接口Client与符合Target接口的对象协同Adaptee定义一个已经存在的接口,这... 阅读全文
摘要:
1.意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。2.结构 3.参与者Builder为创建一个Product对象的各个部件指定抽象接口ConcreteBuilder实现Builder的接口以构造和装配该产品的各个部件定义并明确它所创建的表示提供一个检索产品的接口... 阅读全文
摘要:
1.意图 提供一个创建一系列相关或相互依赖的接口,而无需指定它们具体的类。2.结构 3.参与者AbstractFactory声明一个创建抽象产品对象的操作接口ConcreteFactory实现创建具体产品对象的操作AbstractProduct为一类产品对象声明一个接口ConcreteProdu... 阅读全文
摘要:
线程的实现 1.使用内核线程实现 内核线程(KLT)就是直接由操作系统内核支持的线程,这种线程由内核来完成线程切换,内核通过操纵调度器对线程进行调度,并负责将线程的任务映射到各个处理器上。程序一般不会直接使用内核线程,而是去使用内核线程的一种高级接口——轻量级进程(LWP),轻量级进程就是我们通... 阅读全文
摘要:
Java虚拟机规范中定义一种Java内存模型,用以屏蔽各种硬件和操作形同的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。 Java内存模型规定了所有的变量都存储在主内存(Main Memory)中,每条线程还有自己的工作内存(Working Memory),线程的工... 阅读全文
摘要:
1.类加载的时机 下图是类的生命周期,这里的类既指类class也指接口interface: 其中,加载、验证、准备、初始化和卸载这五个阶段是按顺序开始的,解析则不一定,可能在初始化开始之后才开始。这里说“开始”是因为这些阶段可能是互相交叉地进行的。 下面五种情况必须立即对类进行初始化(加载... 阅读全文
摘要:
Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑的排列在Class文件中,中间没有任何分隔符。Class文件的结构只有两种数据类型:无符号数和表。无符号数以u1、u2、u4和u8来代表1个字节、两个字节、四个字节和八个字节的无符号数,可以用来描述数字、索引引用、数... 阅读全文
摘要:
1.Serial收集器 进行垃圾收集时,需要暂停其他所有的工作线程(Stop the world),知道它完成收集工作。暂停所有工作线程带来不良的用户体验,但由于其简单而高效,Client模式下的虚拟机仍然是个很好的选择。2.ParNew收集器 Serial收集器的多线程版本,是许多运行在Ser... 阅读全文
摘要:
1.标记-清除算法 算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。 标记过程在对象死了吗中已经介绍过。 该算法主要存在两个问题:1.效率问题,标记和清除两个过程都效率不高;2.标记清除后会产生大量不连续的内存碎片。2.复制算法 将内存... 阅读全文
摘要:
垃圾收集器在对堆进行回收前,需要先判断堆中哪些对象是“活着”的,哪些对象是“死了”的。1.引用计数法 给对象添加一个引用计数器,每当有一个地方引用它时,计数器加1,当引用失效时,计数器减1。任何时刻计数器为0的对象就是不可能再被使用的。 引用计数器实现简单,效率高。但是主流的JVM并没有使用引用... 阅读全文
摘要:
JDK5之前Java是靠synchronized关键字保证同步,这种机制存在以下问题:在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题一个线程持有锁会导致其他需要此锁的线程挂起如果一个优先级高饿线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险synchron... 阅读全文
摘要:
对象的创建(不包括数组和Class对象) 虚拟机遇到一条new指令时,首相检查这个指令的参数是否能再常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。 类加载检查通过后,虚拟机将为新生对象分配内存。对象所需的大小再类... 阅读全文
摘要:
Java在执行Java程序时会把内存划分为若干个不同的数据区:1.程序计数器(Program Counter Register) 程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号计数器。 在任意时刻,一个处理器(内核)都只会执行一条线程中的指令,因此,每条线程都有一个独立的... 阅读全文