随笔分类 - JAVA
摘要:1. 基于某个字段 比如要处理一批数据,把 id 作为查询条件,500 条数据作为一个批次 工具类代码如下: public class DataLoopUtil { /** * 基于某个字段(比如 id, createTime 等), 循环处理数据 * P > Param * R > Result
阅读全文
摘要:1. 现象:CPU 使用率高达 600% idea 打开项目,Mac 风扇狂转不止,通过 Mac 自带的 Activity Monitor 看到有个 Java 进程 CPU 使用率高达 600%,丝毫没有停止的迹象。 2. 分析:查找 CPU 使用率高的线程 按照经验来说,这时候的标准步骤如下: 使
阅读全文
摘要:如果说到分布式 ID,肯定逃不开 Snowflake 算法,其原理如下图 介绍如下 snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫
阅读全文
摘要:foreach 背后 平常我们循环一个 List 大概有下面这三种方式: 传统 for 循环 for (int i = 0; i < list.size(); i++) { } 用迭代器进行迭代遍历 Iterator itr = list.iterator(); while (itr.hasNext
阅读全文
摘要:作用 HashMap 在多线程环境中,扩容的时候可能会死循环;HashTable 只是简单粗暴的在方法上用 synchronized 进行同步,同一时刻,只会有一个线程获取到锁,其他线程全部阻塞(也有可能自旋),性能堪忧。所以 ConcurrentHashMap 诞生了。 结构 Concurrent
阅读全文
摘要:分析 LinkedHashMap是HashMap的子类,也就是说它与HashMap具有相同存储结构,不同的是,LinkedHashMap加入了一个双向循环链表,链表的头结点是一个不保存数据的head节点。 /** * The head of the doubly linked list. */ pr
阅读全文
摘要:看完HashMap内部的数据结构(数组+链表)和put get的过程,就没再去关注太多。今天脑子里就突然冒出 map 遍历的代码: for(Map.Entry<K, V> entry : map.entrySet()) { } 以前一直以为entrySet()方法就是 HashMap 内部维护了一个
阅读全文
摘要:你需要知道 HashMap内部使用一个数组来存储数据,数组的元素是一个叫Entry的静态内部类,该类不过也只是implements了定义在Map中的Entry接口。 Entry的属性: static class Entry<K,V> implements Map.Entry<K,V> { final
阅读全文
摘要:构造方法 创建线程池的方法如下: ExecutorService executor = Executors.newFixedThreadPool(8); 但是 《阿里 Java 开发手册》中禁止使用Executors工具类的方式创建线程池,而是推荐使用ThreadPoolExecutor的构造方法直
阅读全文
摘要:作用 线程池主要有以下好处 降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行。 提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监
阅读全文
摘要:Queue 阻塞队列(BlockingQueue)继承自 Queue,先看看 Queue 定义了哪些接口 /** * Queue 相对于 Collection 中基本的方法,提供了另外的插入,移除和检查方法。 * 每个方法都有两种形式:如果操作失败,一种是直接抛异常,另一种是返回特殊值(null 或
阅读全文
摘要:Condition 接口 在线程基础一文中说道,Java 中任何一个对象都拥有一组监视器方法(定义在 java.lang.Object 上),主要包括 wait()、wait(long timeout)、notify() 以及 notifyAll() 方法。而且这些方法使用时有个前提,就是必须先获得
阅读全文
摘要:介绍 源码中是这么说的 Basic thread blocking primitives for creating locks and other synchronization classes. LockSupport 是创建锁和其他同步组件中阻塞线程的基本原语 比如在 AQS 中的 FIFO 队
阅读全文
摘要:可重入性 概念 在说 ReentrantLock 之前,先了解下什么是可重入。假如有如下代码 private synchronized static void testA() { testB(); } private synchronized static void testB() { // do
阅读全文
摘要:在【Java 并发编程】——AQS 源码探索之独占式一文中从源码详细介绍了 AQS 独占式的实现方式。本文将介绍 AQS 的共享式,顾名思义,共享式就是允许多个线程同时访问同一个资源。 共享式实例 在独占式中,AQS 中的状态用来表示可获取或者已独占(比如 0 表示可获取,1 表示已被占用)。共享式
阅读全文
摘要:上篇通过 AQS 简单地实现了一个独占锁,锁最主要的方法就是 lock() 和 unlock(),那我们就从 lock 走起 public void lock() { sync.acquire(1); } 获取(不响应中断) 自定义组件中独占式获取便是调用同步器的模板方法 acquire(int a
阅读全文
摘要:介绍 队列同步器 AbstractQueuedSynchronizer,简称为 AQS,是用来构建锁及其他同步组件(比如 ReentrantLock、CountDownLatch)的基础框架。它使用了一个 int 成员变量表示同步状态,通过内置的 FIFO 队列来完成获取资源线程的排队工作。AQS
阅读全文
摘要:volatile 的特性 关键字 volatile 可以说是 Java 虚拟机提供的最轻量级的同步机制。 当一个变量被定义为 volatile 之后,它将具备两种特性,可见性和禁止指令重排。 可见性 这里的“可见性”是指当一个线程修改了 volatile 变量,其他线程是可以立即得知的。而普通变量不
阅读全文
摘要:final 域的重排序规则 对于 final 域,编译器和处理器要遵守两个重排序规则: 在构造函数内对一个final 域的写入,与随后把这个构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 初次读一个包含 final 域的对象的引用,与随后初次读这个 final 域,这两个操作之间不能重
阅读全文
摘要:收集算法是内存回收的理论基础,垃圾收集器是内存回收的具体实现。在 HotSpot 虚拟机实现中,目前有 7 种垃圾收集器实现,分别是 Serial、ParNew、Parallel Scavenge、CMS、Serial Old 和 G1。前三种是新生代垃圾收集器,后面四种是老年代垃圾收集器。它们可以
阅读全文