同样工作十几年,为什么有的人成为大厂架构师,有的人失业?
在软件开发招聘中,“有多少年工作经验”是一个重要的招聘指标。但实际上,技术能力和工作年限并不是正相关的,特别是工作三五年以后,很多人的技术能力进步就几乎停滞了。
详解Java 虚拟机(第⑥篇)——内存分配与回收策略
一、Minor GC 和 Full GC Minor GC:回收新生代,因为新生代对象存活时间很短,因此 Minor GC 会频繁执行,执行的速度一般也会比较快。Full GC:回收老年代和新生代,老年代对象其存活时间长,因此 Full GC 很少执行,执行速度会比 Minor GC 慢很多。 二、内存分配策略1. 对象优先在 Eden 分配 大多数情况下,对象在新生代 Eden 上分配
详解Java 虚拟机(第⑤篇)——垃圾收集
垃圾收集主要是针对堆和方法区进行。程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后就会消失,因此不需要对这三个区域进行垃圾回收。 一、判断一个对象是否可被回收1. 引用计数算法 为对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。引用计数为 0 的对象可被回收。 在两个对象出现循环引用的情况下,此时引用计数器
详解Java 虚拟机(第④篇)——8 种基本类型的包装类和常量池
Java 基本类型的包装类的大部分都实现了常量池技术, 即Byte,Short,Integer,Long,Character,Boolean; 这 5 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据, 但是超出此范围仍然会去创建新的对象。两种浮点数类型的包装类 Float , Double 并没有实现常量池技术。valueOf() 方法的实现比较简单,就是先判断值是否在
详解Java 虚拟机(第②篇)——HotSpot 虚拟机对象
一、对象的创建对象的创建步骤: 1. 类加载检查 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用, 并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。 如果没有,那必须先执行相应的类加载过程。 2. 分配内存 在类加载检查通过后,接下来虚拟机将为新生对象分配内存。 对象所需的内存大小在类加载完成后便可确定,为对象分配空间的任务
详解Java 虚拟机(第①篇)——运行时数据区域
一、程序计数器(Program Counter Register) 当前线程所执行的字节码行号指示器(逻辑)通过改变计数器的值来选取下一条需要执行的字节码指令和线程一对一的关系,即“线程私有”对 Java 方法计数,如果是 Native 方法则计数器值为 Undefined只是计数,不会发生内存泄漏 二、Java 虚拟机栈每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表
详解Java 容器(完结篇)——详解容器的设计模式、List、Map、并发容器
开门见山的说,本文就是对之前的关于Java容器的文章的一个总结;没有别的意思,简单做个笔记 概览详解Java 容器(第①篇)——概览 设计模式详解Java 容器(第②篇)——容器中的设计模式 源码分析——List详解Java 容器(第③篇)——容器源码分析 - List 源码分析——Map详解Java 容器(第④篇)——容器源码分析 - Map 并发容器详解Java 容器(第⑤篇)—
详解Java 容器(第⑤篇)——容器源码分析 - 并发容器
如果没有特别说明,以下源码分析基于 JDK 1.8。 CopyOnWriteArrayList1.读写分离 写操作在一个复制的数组上进行,读操作还是在原始数组中进行,读写分离,互不影响。 写操作需要加锁,防止并发写入时导致写入数据丢失。 写操作结束之后需要把原始数组指向新的复制数组。 public Boolean add(E e) { //加锁 final Ree
详解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)计算的正确性取决于 多个线程 执行的 时序 时,就会发生 竞态条件。二、顺序一致性模型对内存可见性的保证 对多线程并发时的串行化保证顺序一致性模型的两大特征:一个线程中的所有操作必须按照程序的顺序来执行。(不管程序是否同步)所有线程都只能看到一个单一的操作执行顺序。在顺序一致性内存模型中,每个操作都必须原子执行且立刻对所有线程可见。顺序一致性模型在概念上