代码改变世界

随笔分类 -  JavaSE

Java:Should I use a `HashSet` or a `TreeSet` for a very large dataset?

2022-12-13 15:52 by 杭伟, 71 阅读, 收藏,
摘要: 这是StackOverflow上一个有意思的提问,记录一下。 原地址在这 翻译: 对于大型数据集,应该使用”哈希集”还是”树集”? (因为HashTable有着O(1)的查找速度比树结构更有效率,虽然HashTable的数据无序,但这不是本文的重点) 我需要在数据结构中存储2到1500万个帐户(长度 阅读全文

JUC中常见的集合

2022-12-13 15:06 by 杭伟, 47 阅读, 收藏,
摘要: Map: HashMap > ConcurrentHashMap List: ArrayList > CopyOnWriteArrayList Set: HashSet > CopyOnWriteArraySet Queue: Queue > ConcurrentLinkedQueue 阅读全文

CopyOnWriteArrayList的使用和优缺点

2022-12-13 12:29 by 杭伟, 418 阅读, 收藏,
摘要: CopyOnWriteArrayList允许并发读,读操作无锁,性能较高; 而写操作(含删除),比如向容器中添加/删除一个元素,则首先将当前容器复制一份,然后在新副本上执行写操作,结束之后再将原容器的引用指向新容器。 可以看到,设计上使用volatile数组变量+ReentrantLock可重入锁组 阅读全文

ThreadLocal实现原理和使用场景

2022-12-13 11:09 by 杭伟, 147 阅读, 收藏,
摘要: ThreadLocal是线程本地变量,每个线程中都存在副本。 实现原理: 每个线程中都有一个ThreadLocalMap,而ThreadLocalMap中的key即是ThreadLocal。 内存泄漏: ThreadLocal变量存储在栈内存中,对应对象存储在堆内存中,这个指向是强引用关系。 同样, 阅读全文

ConcurrentHashMap实现原理

2022-12-12 15:18 by 杭伟, 83 阅读, 收藏,
摘要: jdk1.7分段锁: Segment类(小型HashMap),继承ReentrantLock put简要流程: 先根据key,算出Segment数组的下标index 加锁 生成Entry对象,并添加到Segment的数组或链表上(和HashMap相同) segments[index].put(key 阅读全文

JUC同步工具CountDownLatch

2022-12-12 10:06 by 杭伟, 55 阅读, 收藏,
摘要: CountDownLatch:允许一条或多条线程等待其它线程中的一组操作完成后再继续执行。 在探究CountDownLatch之前,我们知道Thread的join也有类似功能,先看thread的join方法: 1 public static void main(String[] args) thro 阅读全文

线程池ThreadPoolExecutor

2022-12-11 23:45 by 杭伟, 176 阅读, 收藏,
摘要: 回顾Java创建线程的几种方式: 1,继承Thread(实际Thread也是实现Runnable接口); 2,实现Runnable接口; 3,实现Callable接口(返回值); 4,由线程池创建。 根据阿里巴巴Java开发手册,关于并发编程有两个强制要求: 1.线程资源必须通过线程池提供,不允许在 阅读全文

Java线程中断机制

2022-12-08 09:53 by 杭伟, 95 阅读, 收藏,
摘要: 在阅读AQS源码以及juc包很多基于AQS的应用源码过程中,会遇到很多interrupted相关的方法,这里复习一下java线程中断相关。 要点:使用interrupt()中断一个线程,该方法只是标记中断,并不会马上中断。马上中断使用stop(),该方法已过期,不建议使用(立刻中断容易造成生产数据一 阅读全文

ReentrantLock源码

2022-12-06 21:13 by 杭伟, 68 阅读, 收藏,
摘要: ReentrantLock即是AQS线程同步队列器思想的具体应用/实现 实现了AQS,并有公平锁和非公平锁(默认非公平锁)两种实现 ReentrantLock有三个重要的内部类:Sync(抽象类),NonfaireSync(Sync的非公平锁实现),FairSync(Sync的公平锁实现) Sync 阅读全文

AQS原理

2022-12-06 18:05 by 杭伟, 153 阅读, 收藏,
摘要: *前置知识: 1,线程的生命周期:新建(new())--就绪(start())--运行(run())--阻塞--死亡; 线程的非运行状态: 等待,挂起,睡眠,阻塞 正常生命周期中运行的线程,如果有同步需求,假如正在竞争一把锁,在没拿到锁时,应该被挂起。(而不是什么都不做) 2,在队列中的线程,应该处 阅读全文

锁的定义和实现、分类

2022-11-30 09:54 by 杭伟, 495 阅读, 收藏,
摘要: 什么是锁? 通过一种抽象的锁来对资源进行锁定。具体来说:操作修改一个数据,在同一时刻只允许一个线程操作,操作完毕才能轮到下一个线程。 在这个过程中,是什么阻止了另一个线程的操作?即是“锁”。 Java锁机制: (主要发生在堆和方法区等线程共享的数据区域) java中每个对象都有一把锁,锁记录在对象头 阅读全文

HashMap实现原理和自动扩容

2022-11-28 17:42 by 杭伟, 131 阅读, 收藏,
摘要: HashMap实现原理: JDK1.7:数组+单向链表(头插) 在并发情况下头插可能出现循环链表(死循环)问题。原因:因为头插,在新数组中链表的元素顺序发生了变化, 如上图,假设线程1在扩容,刚刚调整链表完毕;线程2的指针却指向的还是原来的元素。这时新数组链表中是1->2->3的指向,但是线程2却是 阅读全文

ArrayList实现原理和自动扩容

2022-11-18 16:34 by 杭伟, 214 阅读, 收藏,
摘要: ArrayList在Java集合中的位置, ArrayList原理: transient Object[] elementData; ArrayList通过数组来实现。 默认构造方法会构造一个容量为10的空数组。 自动扩容: 在每次添加新元素(Add方法)时,都会通过grow方法判断当前list的s 阅读全文