Java

98 阅读4分钟

Java 8

Java 8 新特性
Java8——方法引用

集合

20171231221535412.png

红黑树

漫画:什么是红黑树?
硬核图解面试最怕的红黑树【建议反复摩擦】_敖 丙的博客

map

HashMap实现原理和源码分析_AItsuki的博客
LinkedHashMap(JDK1.8)源码解析_ThinkWon的博客

集合的modCount字段和Fail-Fast,Fail-Safe机制解释_AItsuki的博客
System.arraycopy()和Arrays.copyOf()到底是浅拷贝还是深拷贝

IO

image.png
Java输入/输出流

多线程

竞态条件: 程序执行结果受线程执行顺序影响

线程

守护线程
(88条消息) Java 守护线程_ZhSuZhan的博客-CSDN博客_java 守护线程

同步机制

内置锁、同步队列

volatile
synchronized
object 内置条件队列

显式锁、条件队列

ReentrantLock详解 与内置锁相对应
深入剖析ReentrantLock实现原理 - 知乎 (zhihu.com)
ReentrantReadWriteLock
ReentrantLock.newCondition() 内置条件队列,与object相对应

工具类

ThreadLocal,一篇文章就够了 - 知乎 (zhihu.com)

闭锁 CountDownLatch

计数信号量 semaphore

栅栏

CyclicBarrier

类似于闭锁,开放后重置

final域 保证初始化安全性

类内静态对象,初始化

同步容器类

vector
hashtable
内部方法都加了内置锁,效率低

并发容器类

ConcurrentHashMap详解
使用细粒度分段锁,效率高,但size等方法的返回值只是估计值。

copyonwriteArraylist
CopyOnWriteArraySet
Java CopyOnWriteArrayList、set详解 - 简书 (jianshu.com)

任务执行

thread
runnnable

未来任务
futuretask
calllable 可以抛出异常

线程状态

Java线程的6种状态及切换

线程停止

interrupt 协作机制
stop
执行完成

线程池

JDK ThreadPoolExecutor核心原理与实践 image.png

  • Executor:作为线程池的最顶层接口,Executor的接口在设计上,实现了任务提交任务执行之间的解耦,这是它存在的意义。在Executor中,只定义了一个方法void execute(Runnable command),用于执行提交的可运行的任务。注意,你看它这个方法的参数干脆就叫command,也就是“命令”,意在表明所提交的不是一个静止的对象,而是可运行的命令。并且,这个命令将在未来的某一时刻执行,具体由哪个线程来执行也是不确定的;

  • ExecutorService:继承了Executor的接口,并在此基础上提供可以管理服务执行结果(Futrue) 的能力。ExecutorService所提供的submit方法可以返回任务的执行结果,而shutdown方法则可以用于关闭服务。相比起来,Executor只具备单一的执行能力,而ExecutorService则不仅具有执行能力,还提供了简单的服务管理能力

  • AbstractExecutorService:作为ExecutorService的简单实现,该类通过RunnableFuture和newTaskFor实现了submit、invokeAny和invokeAll等方法;

  • ThreadPoolExecutor:该类是线程池的最终实现类,实现了Executor和ExecutorService中定义的能力,并丰富了AbstractExecutorService中的实现。在ThreadPoolExecutor中,定义了任务管理策略和线程池管理能力,相关能力的实现细节将是我们下文所要讲解的核心所在。

executors 提供默认线程池
聊聊线程池设计与原理,由表及里趣味解析
线程池、饱和策略详解

ThreadFactory 线程池内置线程工厂

不配置统一用Executors的默认线程工厂

 DefaultThreadFactory

线程池任务队列

BlockingQueue及其子类

饱和策略

RejectedExecutionHandler 子类
Java线程池--饱和策略(拒绝策略)

线程池的状态与生命周期管理

前文说过,线程池恰似一个生产车间,而从生产车间的角度看,生产车间有运行、停产等不同状态,所以线程池也是有一定的状态和使用周期的。 image.png

  • Running:运行中,该状态下可以继续向线程池中增加任务,并正常处理队列中的任务;
  • Shutdown:关闭中,该状态下线程池不会立即停止,但不能继续向线程池中增加任务,直到任务执行结束;
  • Stop:停止,该状态下将不再接收新的任务,同时不再处理队列中的任务,并中断工作中的线程
  • Tidying:相对短暂的中间状态,所有任务都已经结束,并且所有的工作线程都不再存在(workerCount==0),并运行terminated()钩子方法;
  • Terminated:terminated()运行结束。



作者:让我来搞这个bug
链接:www.jianshu.com/p/ce0770001… 来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

AQS

Java 并发高频面试题:聊聊你对 AQS 的理解?_敖 丙的博客

CAS ABA

CAS ABA