- 一个线程两次调用start()方法会出现什么情况?
- 什么情况下Java程序会产生死锁?如何定位、修复?
- 银行家算法的模拟和实现
- Java并发包提供了哪些并发工具类?
- 并发包中的ConcurrentLinkedQueue和LinkedBlockingQueue有什么区别?
- Java并发类库提供的线程池有哪几种? 分别有什么特点?
- 线程池 包含 Executors ExecutorService
- ExecutorService 包含 ThreadPoolExecutor ForkJoinPool ScheduledThreadPoolExecutor
- ThreadPoolExecutor 关联(继承) ScheduledThreadPoolExecutor
- Executors 包含 newCachedThreadPool newFixedThreadPool newSingleThreadExecutor newSingleThreadScheduledExecutor newWorkStealingPool
- newWorkStealingPool 关联 work-steeling
- Java 多线程(5):Fork/Join 型线程池与 Work-Stealing 算法
- AtomicInteger底层实现原理是什么?如何在自己的产品代码中应用CAS操作?
- 请介绍类加载过程,什么是双亲委派模型
- Maven之依赖配置-关于依赖传递、依赖范围和类加载器
- 有哪些方法可以在运行时动态生成一个Java类?
- jdk动态代理为什么必须是基于接口实现的
- 谈谈JVM内存区域的划分,哪些区域可能发生OutOfMemoryError?
- 如何监控和诊断JVM堆内和堆外内存使用?
- JVM学习(7)Stop-The-World
- 垃圾回收 包含 Stop-The-World
- Java常见的垃圾收集器有哪些?
- Java内存模型中的happen-before是什么?
- 终于有人把Java内存模型(JMM)说清楚了
- ArrayList还是LinkedList?使用不当性能差千倍
- Stream流水线原理
- 网络通信优化之I/O模型:如何解决高并发下I/O瓶颈?
- 阻塞和非阻塞对CPU的影响
一个线程两次调用start()方法会出现什么情况?
https://blog.csdn.net/zl1zl2zl3/article/details/80776112
线程
线程 包含 内核线程 用户线程
进程 关联 线程
线程 包含 NEW RUNNABLE BLOCKED WAITING TIMED_WAIT TERMINATED
NEW
表示线程被创建出来还没真正启动的状态
在第二次调用start()方法的时候,线程可能处于终止或者其他(非NEW)状态,但是不论如何,都是不可以再次启动的。
RUNNABLE
表示该线程已经在JVM中执行,当然由于执行需要计算资源,它可能是正在运行,也可能还在等待系统分配给它CPU片段,在就绪队列里面排队。
BLOCKED
阻塞表示线程在等待Monitor lock。比如,线程试图通过synchronized去获取某个锁,但是其他线程已经独占了,那么当前线程就会处于阻塞状态。
WAITING
TIMED_WAIT
JVM 关联 守护线程
当只有守护线程存在时,JVM将结束进程
什么情况下Java程序会产生死锁?如何定位、修复?
https://blog.csdn.net/weixin_44240370/article/details/96911182
死锁
死锁 关联 jstack ThreadMXBean
利用jstack 查看线程状态, 等待锁对象, 对比持有状态\
死锁 关联 Monitor
死锁 关联 银行家算法
银行家算法的模拟和实现
https://www.jianshu.com/p/a47c45cf49c7
银行家算法
Java并发包提供了哪些并发工具类?
https://www.cnblogs.com/xushuyi/articles/9208980.html
java并发包
java并发包 包含 同步结构 线程安全的容器 并发队列 Executor
同步结构 包含 CountDownLatch CyclicBarrier Sempahore
线程安全的容器 包含 ConcurrentHashMap ConcunrrentSkipListMap CopyOnWriteArrayList
阻塞队列 包含 ArrayBlockingQueue SynchronousQueue PriorityBlockingQueue
CountDownLatch 关联 CyclicBarrier
CountDownLatch 不可重用 CyclicBarrier可循环使用
CountDownLatch分为await和countDown两个方法, 所以栅栏可以放在任何地方。CyclicBarrier 只有await方法,所以逻辑只能在子线程中
并发包中的ConcurrentLinkedQueue和LinkedBlockingQueue有什么区别?
https://blog.csdn.net/qq541005640/article/details/81877586
java并发包 包含 Concurrent CopyOnWrite Blocking
Concurrent lock-free(无锁编程) 提供遍历弱一致性 ,即容器修改时,迭代器也可遍历
copyOnWrite表示写时复制,修改操作很重
Blocking 基于锁实现
并发队列 包含 非阻塞队列 阻塞队列
非阻塞队列 就是 ConcurrentLinkedQueue,而阻塞队列则是实现了BlockingQueue的队列
阻塞队列 包含 有界阻塞队列 无界阻塞队列
有界阻塞队列 包含 ArrayBlockingQueue LinkedBlockingQueue
LinkedBlockingQueue因默认大小为 Integer.Max 所以是无界队列, 但内部实现是有界队列
无界阻塞队列 包含 PriorityBlockingQueue DelayedQueue LinkedTransferQueue
Java并发类库提供的线程池有哪几种? 分别有什么特点?
https://blog.csdn.net/qq541005640/article/details/81878388
线程池 包含 Executors ExecutorService
IO密集型 线程数 = CPU 核数 × (1 + 平均等待时间 / 平均工作时间) 计算密集型 CPU 核数 + 1
ExecutorService 包含 ThreadPoolExecutor ForkJoinPool ScheduledThreadPoolExecutor
ThreadPoolExecutor 关联(继承) ScheduledThreadPoolExecutor
Executors 包含 newCachedThreadPool newFixedThreadPool newSingleThreadExecutor newSingleThreadScheduledExecutor newWorkStealingPool
newWorkStealingPool 关联 work-steeling
Java 多线程(5):Fork/Join 型线程池与 Work-Stealing 算法
https://segmentfault.com/a/1190000008140126
ForkJoinPool 关联 work-steeling
AtomicInteger底层实现原理是什么?如何在自己的产品代码中应用CAS操作?
https://blog.csdn.net/qq541005640/article/details/81878924
lock-free 包含 Atomic VarHandle AtomicFieldUpdater
VarHandle java9提供,推荐使用
Atomic 关联 CAS
CAS unsafe调用底层 cpu指令 如 x86架构cmpxchg, 精简指令集load and reserve和store conditional 属于轻量级操作
CAS 关联 AtomicStampedReference AtomicReference
ABA 问题 AtomicStampedReference比AtomicReference多保存一个时间戳
AQS
AbstractQueuedSynchronizer,利用 AQS实现同步结构 需要要实现 acquire, release
AQS 包含 一个 volatile 的state 一个FIFO的等待线程队列(Node链表) 和 其他CAS的操作方法
关键方法 tryAcquire 和 acquireQueued
tryAcquire 尝试获取锁,实现的实现逻辑由子类实现
acquireQueued 在tryAcquire失败后 addWaiter创建一个排他节点,并进入排队竞争模式:此时若非头节点, 判断节点状态waitStatus,若需要等待调用LockSupport.park进入等待
AQS 关联 LockSupport.park
调用 LockSupport.park 使线程进入等待状态
LockSupport.park(thread) 不释放锁 park在unpark之前之后调用都不会影响 park的结果
ReentrantLock 关联 AQS
ReentrantLock 中的 sync对象继承自AQS
ReentrantLock 包含 FairSync NonfairSync
公平锁实现和非公平锁的唯一区别是 公平锁在判断 无进程占用锁(state=0)时,会调用 hasQueuedPredecessors判断当前队列中是否有进程
请介绍类加载过程,什么是双亲委派模型
https://zhuanlan.zhihu.com/p/142273961
类加载
类加载包含三个主要步骤:加载、链接、初始化
加载: 将不同类型的文件加载进jvm
链接: 1.验证(验证文件格式是否符合jvm规范). 2.准备(初始化类及其静态变量,侧重于申请内存).3.解析(将符号引用替换为真实内存的直接引用)
初始化阶段: 类初始化的代码,包含静态变量的赋值,静态代码块的执行.
类加载 关联 双亲委派机制
类加载机制有三个基本特征: 双亲委派,可见性(父类加载的类对子类可见),单一性(一个类型子父之间只会加载一次)
Bootstrap Class-Loader, Extension or Ext Class-Loader, Application or App Class-Loader
Maven之依赖配置-关于依赖传递、依赖范围和类加载器
https://blog.csdn.net/weixin_33885676/article/details/91910242
类加载 关联 tomcat类加载
违反双亲委派. 表现为 用户定义的类高于web容器的类 当WebAppClassLoader处理时,先查询webapp下有没有,再查CommonClassLoader和AppClassLoader.
有哪些方法可以在运行时动态生成一个Java类?
https://time.geekbang.org/column/article/10076
ASM 关联 字节码
封装再JDK内部实现中, 以操作底层jvm指令来操作字节码
cglib 关联 ASM
底层封装了ASM
jdk动态代理为什么必须是基于接口实现的
https://blog.csdn.net/qq_35016215/article/details/98867152
jdk动态代理 关联 字节码
jdk动态代理的实现 基于 Proxy 类调用 ProxyGenerator 生成字节码文件,最后调用native defineClass0方法加载类。其生成的class对象已经继承自Proxy类,而java是单继承的,
所以子类无法再继承一个类,只能实现接口
谈谈JVM内存区域的划分,哪些区域可能发生OutOfMemoryError?
https://blog.csdn.net/qq541005640/article/details/81987199
运行时数据区域 包含 程序计数器 栈 堆
程序计数器和栈为线程私有, 堆为线程共享
程序计数器存在当前线程所执行方法的jvm指令地址
栈 包含 本地方法栈 Java虚拟机栈
堆 包含 GC堆 方法区
方法区在1.8之后由 元数据区替代
方法区 包含 运行时常量池
GC堆 包含 新生代 老年代
新生代 为 Eden + Survivor(from, to)
如何监控和诊断JVM堆内和堆外内存使用?
https://blog.csdn.net/qq541005640/article/details/81987435
GC堆
JVM学习(7)Stop-The-World
https://www.jianshu.com/p/d686e108d15f
垃圾回收 包含 Stop-The-World
为了保证引用更新的正确性, 防止在gc的时候会有新的对象创建出来并关联标记为删除的对象上
Java常见的垃圾收集器有哪些?
https://blog.csdn.net/qq541005640/article/details/81988512
垃圾收集器 包含 Serial GC ParNew GC CMS Parallel GC G1 GC
Serial GC 新生代使用复制算法 老年代使用 标记-整理 单线程gc
ParNew GC 新生代 Serial GC的多线程版本,配合老年代CMS GC
CMS GC 老年代 基于标记-清除算法
Parallel GC 新生代老年代 吞吐量优先的 GC
G1 GC region
垃圾回收算法 包含 引用计数 可达性分析
java没有采用引用计数, 很难处理循环引用的关系
垃圾回收算法 包含 复制算法 标记清除算法 标记整理算法
Java内存模型中的happen-before是什么?
https://blog.csdn.net/qq541005640/article/details/82017414
JMM
JMM屏蔽了底层CPU优化的差异性, 程序员无需关心底层指令的细节, 基于JMM规范的happen-before原则,所提供的跨线程的内存可见性保证, 进行并发编程。
终于有人把Java内存模型(JMM)说清楚了
https://www.jianshu.com/p/8420ade6ff76
JMM 包含 可见性 有序性 原子性
并发编程为了保护数据安全,需要满足可见性有序性原子性,JMM 规范了并发编程的规范 JSR-133
原子性 关联 synchronized
java中提供了 monitorenter和monitorexit 对应的就是 synchronized,保证代码块中的操作为原子性的
可见性 关联 volatile synchronized final
volatile修饰的变量在使用前从主内存刷新
有序性 关联 volatile synchronized
volatile使用 内存屏障 禁止指令重排
synchronized仅允许单一线程操作
ArrayList还是LinkedList?使用不当性能差千倍
https://blog.csdn.net/weixin_37948888/article/details/99704328
ArrayList
扩容1.5倍
ArrayList 关联 Cloneable
ArrayList 关联 transient Serializable
ArrayList中的 数组对象被transient修饰,代表不会被序列化,是因为避免默认的序列化方法把数组中空数据的部分也序列化了,所以内部实现了writeObject和readObject来实现序列化与反序列化,使用transient修饰数组,是防止对象数组被其他外部方法序列化
LinkedList
双向链表
LinkedList 关联 Cloneable
LinkedList 关联 transient Serializable
因为是双向链表,transient防止只对头尾进行序列化,LinkedList自己实现了序列化
Stream流水线原理
https://www.jianshu.com/p/893fb6febc70
Stream 包含 ReferencePipeline Stage Sink
Stream 的管道结构是由 ReferencePipeline实现的,其中包含 Head StatelessOp StatefulOp
Stage是stream中每一个使用阶段,与业务相关,可以是 StatelessOp或StatefulOp
Sink接口用来串联Stage之间的调用顺序 提供 begin end cancellationRequested accept
Stream 包含 中间操作 终结操作
中间操作 包含 无状态 有状态
终结操作 包含 短路 非短路
Map 关联 Collection
网络通信优化之I/O模型:如何解决高并发下I/O瓶颈?
https://time.geekbang.org/column/article/99478
JavaIO 包含 字节流 字符流
字节流 包含 InputStream OutputStream
Stream是字节流的抽象其中包含 FileInputStream ByteArrayInputStream等
字符流 包含 Reader Writer
Reader包含 FileReader StringReader等
阻塞和非阻塞对CPU的影响
https://www.jianshu.com/p/6f132d27aeaf?utm_campaign
同步阻塞IO 关联 同步非阻塞IO IO多路复用
非阻塞相对于阻塞IO的优点在于阻塞IO虽不会直接占用大量CPU,但在高并发下创建的大量线程会造成CPU上下文的频繁切换,这是十分占用CPU资源的
