Java
232 篇笔记
- 6.11 11.CopyOnWriteArraySethistorical
1. 是什么 写时复制的set,有序不重复,底层使用CopyOnWriteArrayList实现 2. 如何使用 3. 原理分析 3.1. 构造方法 3.1.1. 底层使用CopyOnWriteArrayList实现 3.2. add方法 3.2.1. 转调CopyOnWriteArrayList
- 6.12 ArrayBlockingQueuehistorical
1. 是什么 使用Object数组实现的有界的阻塞队列 读读、读写、写写相互阻塞 2. 如何使用 2.1. 方法选择 方法\处理方式 抛出异常 返回特殊值 一直阻塞 超时退出 ------------ --------- --------- ------- ------------------ 插入
- 6.13 13.ThreadLocalhistorical
1. 是什么 不是线程同步机制,是一种线程数据隔离机制。 多线程共享变量通信的情况下,我们需要保证线程安全。一种方法是使用锁,另一种就是数据隔离机制。 ThreadLocal用的是后一种,即每个线程操作的是自己独有的数据,因此互相之间不会影响 2. 如何使用 3. 原理分析 3.1. uml Thr
- 6.14 14.ThreadPoolhistorical
1. 是什么 Java的线程池框架,他提供了“任务提交”与“任务执行”分离开的机制 1.1. 为什么需要线程池 用来复用线程 - 第一,线程的创建和销毁开销比较大 - 第二,线程数量过多的话会导致cpu忙于上下文切换而不“干活” 1.2. 使用场景 - 单个任务执行的时间不能太长 - 任务数很多 2
- 6.15 CompletableFuturehistorical
1. 是什么 用于异步编程。(准备说是非阻塞) Java中所谓的异步编程其实就是把阻塞的代码放在一个单独的线程中执行,并且有结果时会通知主线程 2. Future VS CompletableFutre Future CompletableFutre ------------------ -----
- 6.16 JDK1.7的ConcurrentHashMaphistorical
1. 构造方法 2. put方法 2.1. hash 2.2. ensureSegment 2.3. segment的put方法 2.3.1. scanAndLockForPut 2.3.2. rehash 3. get 4. containsKey方法 5. remove 5.1. segment
- 6.17 fork_joinhistorical
1. 是什么 并行执行的框架。把一个大任务分成多个小任务,每个小任务计算结果,最后汇总每个小任务的结果得到大任务的结果 1.1. 为什么出现 简单地使用线程池实现fork join需要考虑当前线程也跟着干活,而不是变成监工 2. 使用场景 计算密集型的任务 3. 如何使用 4. 原理分析 4.1.
- 6.18 Exchangerhistorical
1. 是什么 用于两个线程之间交换数据,数据的流向是双向的。即如果有Thread1和Thread2两个线程,Thread1传给Thread2一个数据 ,Thread2同时也会传给Thread1一个数据。 1.1. Exchanger对比SychronousQueue Exchanger Sychro
- 6.19 ReentrantReadWriteLockhistorical
1. ReentrantReadWriteLock是什么 ReentrantLock保证了同一时间只有一个线程可以在临界区读或者写数据,这意味着如果有两个读线程同时读取数据,ReentrantLock也只允许其中一个通过,但我们想要的是读可以并发执行,一旦有写则其他线程等待。如下表: 是否可以同时进
- 6.20 Semaphorehistorical
1. 是什么 限流工具类,同一时间只允许n个线程访问某资源 2. 原理分析 2.1. uml 可以看出Semaphore也有公平的和非公平之分,参考 - 非公平信号量.md - 公平信号量.md