一个线程两次调用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

wait或join等方法的指定超时版本

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.util.concurrent

java并发包 包含 同步结构 线程安全的容器 并发队列 Executor

同步结构 包含 CountDownLatch CyclicBarrier Sempahore

线程安全的容器 包含 ConcurrentHashMap ConcunrrentSkipListMap CopyOnWriteArrayList

concurrentSkipMap有序, 底层实现跳表

阻塞队列 包含 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之后由 元数据区替代

方法区 包含 运行时常量池

字符串常量在1.8后存放在gc堆中

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

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资源的