详解Java 容器(第④篇)——容器源码分析 - Map
如果没有特别说明,以下源码分析基于 JDK 1.8。 一、HashMap为了便于理解,以下源码分析以 JDK 1.7 为主。 1. 存储结构 内部包含了一个 Entry 类型的数组 table。 transient Entry[] table; Entry 存储着键值对。它包含了四个字段,从 next 字段我们可以看出 Entry 是一个链表。 即数组中的每个位置被当成一个桶,一个桶
详解Java 容器(第③篇)——容器源码分析 - List
如果没有特别说明,以下源码分析基于 JDK 1.8。 一、ArrayList1. 概览 实现了 RandomAccess 接口,因此支持随机访问。这是理所当然的,因为 ArrayList 是基于数组实现的。 public class ArrayList<E> extends AbstractList<E> implements List<E
详解Java 容器(第②篇)——容器中的设计模式
一、迭代器模式 Collection 继承了 Iterable 接口,其中的 iterator() 方法能够产生一个 Iterator 对象,通过这个对象就可以迭代遍历 Collection 中的元素。 从 JDK 1.5 之后可以使用 foreach 方法来遍历实现了 Iterable 接口的聚合对象。 List<String> list = new ArrayList&l
详解Java 容器(第①篇)——概览
容器主要包括 Collection 和 Map 两种,Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表。 一、Collection 1. Set TreeSet:基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作。 但是查找效率不如 HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)。Ha
深入理解Java多线程与并发框(完结篇)——看完再不懂多线程我跪键盘
前言没有别的意思,就是想给大家深入理解Java多线程与并发框 1. 线程的状态 深入理解Java多线程与并发框(第①篇)——线程的状态 2. 线程和进程的区别 深入理解Java多线程与并发框(第②篇)——线程和进程的区别 3. Java内存模型与原子性、可见性、有序性 深入理解Java多线程与并发框(第③篇)——Java内存模型与原子性、可见性、有序性 4. 重排序、屏障指令、a
深入理解Java多线程与并发框(第⑪篇)——线程池参数
ThreadPoolExecutor线程池线程的创建和销毁都会消耗大量资源,就好像公司每天上午9点工作时就招进一批员工,晚上6点干完活就辞退一批员工,这都会销毁公司大量资源。所以合理利用 “池” 中固定、稳定的线程是非常有必要的。 扩展关系ThreadPoolExecutor 构造方法 ThreadPoolExecutor 共有四个构造方法: ThreadPoolExecutor(int
深入理解Java多线程与并发框(第⑩篇)——并发辅助工具类(很好的玩的工具类)
一、Exchanger 交换器(两线程间的通信)使用场景:用于 有且仅有两个线程 间的 数据传输,就就是线程间的 通信 。它是 生产者/消费者 d的 wait() / notify() 的最佳替代工具。 核心原理:方法 exchange()阻塞特性:此方法被调用后等待其他线程来取数据,如果没有其他线程取得数据,则一直 阻塞。 示例:交替打印奇偶数: public class Print {
深入理解Java多线程与并发框(第⑨篇)——并发包的基石:队列同步器 AQS
一、 AbstractOwnableSynchronizer 抽象的、可拥有的同步器源码分析:package java.util.concurrent.locks; /** * 可由线程独占的同步器。 * 该类为创建锁和相关的同步器提供了基础,可能需要拥有所有权的概念。 * Abst
深入理解Java多线程与并发框(第⑧篇)——深入理解:CAS
CAS实现原理CAS 是 CompareAndSwap 的缩写,意思是 比较 并 交换。 它是无锁化的实现是经典的乐观锁。CAS 操作很简单,它包含三个操作数:内存地址V、预期原值A、新值B。先比较内存地址V处的值与预期原值A是否相等,如果相等就将内存地址V处更新为新值B。在配合循环使用时,若CAS操作失败,会循环执行或到达某个终止处。此操作配合 循环 使用时,又称为 自旋锁 的实现方式。CAS存
深入理解Java多线程与并发框(第⑦篇)——volatile 关键字
概念把对 volatile变量的单个读/写,看成是使用 同一个监视器锁 对这些单个读/写操作做了 同步。 原理:插入内存屏蔽指令,禁止一定条件下的重排序。volatile 是轻量级的同步机制举例说明:public class Assignment { int value = 1; /** &n
深入理解Java多线程与并发框(第⑥篇)——synchronized 关键字
一、Class文件与对象对象头 32位JVM的对象头二、synchronized 三种应用方式用于实例对象方法(对象是锁) 用于静态方法(类是锁) 用于同步代码块(同步代码块是锁)三、synchronized 底层语义原理锁:就在对象头中Java 虚拟机中的同步(Synchronization)基于 进入enter 和 退出exit 监视器(Monitor)对象 实现, 无论是显式同步(有明确的
深入理解Java多线程与并发框(第⑤篇)——顺序一致性模型
一、竞态条件(Race Condition)计算的正确性取决于 多个线程 执行的 时序 时,就会发生 竞态条件。二、顺序一致性模型对内存可见性的保证 对多线程并发时的串行化保证顺序一致性模型的两大特征:一个线程中的所有操作必须按照程序的顺序来执行。(不管程序是否同步)所有线程都只能看到一个单一的操作执行顺序。在顺序一致性内存模型中,每个操作都必须原子执行且立刻对所有线程可见。顺序一致性模型在概念上
深入理解Java多线程与并发框(第④篇)——重排序、屏障指令、as-if-serial规则
一、重排序前篇文章已经讲了Java内存模型和与其三个特性:原子性、可见性、有序性。但事实上,为了提升程序的执行性能,编译器 和 处理器 常常会对程序指令序列进行 重排序。 重排序分为以下几种: 编译器优化重排序处理器重排序 指令级并行重排序内存系统重排序 二、屏障指令fence 内存屏障(Memory Barrier,或称为内存栅栏,Memory Fence)是一种CPU指令
深入理解Java多线程与并发框(第③篇)——Java内存模型与原子性、可见性、有序性
一、Java内存模型Java Memory Modle,简称 JMM,中文名称 Java内存模型,它是一个抽象的概念,用来描述或者规范访问内存变量的方式。因为各中计算机的操作系统和硬件不同,方式机制也可能不同,Java内存模型用于屏蔽(适配)各种差异,以此来达到访问各个平台的一致的效果。这也是Java夸平台的重要原因之一。 主内存: Java内存规定了所有变量都存储在主内存(Main M
深入理解Java多线程与并发框(第②篇)——线程和进程的区别
线程和进程的区别1. 资源调度单位 在计算机中,进程是程序运行所使用资源的基本单位。比如传统的一个Web应用,运行它需要多少资源,操作系统应该分配多少资源,都是进程为基本单位进行分配资源(资源包括内存、CPU、磁盘、I/O等)。我们知道CPU是一台计算机的运算核心和控制核心,它的功能解释并处理计算机指令,而进程这种量级的资源对于CPU来说实在太大了,无法调度,将进程划分为多个称为线程的实体,
深入理解Java多线程与并发框(第①篇)——线程的状态
1. 新建状态(New) 万事万物都不是凭空出现的,线程也一样,它被创建后的状态称为 新建 状态。 比如: Thread thread = new Thread(); 2. 可运行状态(Runable) 线程被创建后是不能使用的,就是让用户在此期间设置一些属性, 比如: // 设置类加载器 thread.setContextClassLoader(System.
Java常见知识点汇总(完结篇)——这应该是2020年最详细的Java知识点汇总
纸上得来终觉浅,绝知此事要躬行。笔者之前对每部分的内容对做了比较深入的学习以及代码实现,基本上比较全面地讲述了每一个Java基础知识点,当然可能有些遗漏和错误,欢迎读者指正。
Java常见知识点汇总(⑳)——锁
锁的概念可重入锁 如果锁具备可重入性,则称作为可重入锁。像synchronized和ReentrantLock都是可重入锁,可重入性在我看来实际上表明了锁的分配机制:基于线程的分配,而不是基于方法调用的分配。举个简单的例子,当一个线程执行到某个synchronized方法时,比如说method1,而在method1中会调用另外一个synchronized方法method2,此时线程不必重新去
Java常见知识点汇总(⑲)——Java中的强引用、弱引用、软引用、虚引用
强引用:默认情况下,对象采用的均为强引用(这个对象的实例没有其他对象引用,GC时才会被回收)软引用:软引用是Java中提供的一种比较适合于缓存场景的应用(只有在内存不够用的情况下才会被GC)弱引用:在GC时一定会被GC回收虚引用:由于虚引用只是用来得知对象是否被GC 一. 强引用(StrongReference)强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。
Java常见知识点汇总(⑱)——Jvm内存结构、Java内存模型、Java对象模型的区别
一. Java内存结构我们都知道,Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途。其中有些区域随着虚拟机进程的启动而存在,而有些区域则依赖用户线程的启动和结束而建立和销毁。 各个区域的功能不是本文重点,就不在这里详细介绍了。这里简单提几个需要特别注意的点: 以上是Java虚拟机规范,不同的虚拟机实现