多线程相关知识整理(二)
-
往期内容:
-
线程的生命周期:
-
生命周期图。
-
可通过查看Thread类中的内部类State结合图一起理解。
-
NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED。
NEW: 线程还未启动的线程的状态。
RUNNABLE: 可运行线程的线程状态。可能正在JVM中执行,但它也有可能是在等待操作系统中的其他资源,比如处理器,甚至是等待处理器等待IO等操作时,按照惯性思维会觉得线程此时应该是阻塞的状态,但实际上不是。
BLOCKED: 指一个线程的线程状态阻塞等待监视器锁。 处于阻塞状态的线程正在等待监视器锁进入synchronized(同步)块/方法或调用后重新进入synchronized(同步)块/方法,与操作系统的阻塞状态无关。
WAITING: 线程等待状态。 线程处于等待状态,由于调用了以下方法:
Object.wait()
,Thread.join
,LockSupport.park()
。等待线程在等待另一个线程执行特定动作,比如说一个调用了Object.wait()
的线程正在等待另一个线程调用Object.notify()
或者Object.notifyAll()
。调用了Thread.join()
的线程等待线程终止。TIMED_WAITING: 线程状态与指定的等待时间等待的线程。当线程处于定时等待状态时的状态,比如调用了
Object.wait(long)
,Thread.join(long)
这种传入等待时长的方法。TERMINATED: 线程终止的线程状态。 线程执行完毕。
-
ThreadLocal:
-
同一个对象根据调用线程不同返回不同的值。
-
通常用于储存线程私有的值,方便后续流程使用。
-
源码:
为什么要使用private,static修饰ThreadLocal对象,源码中有描述ThreadLocal实例通常是:
private staic fileds in classes
为什么要设计成数据不存在ThreadLocal对象中:
将数据与线程的状态绑定在一起,当线程结束了,相应的局部变量副本也会被垃圾回收,如果ThreadLocal持有数据,那么线程结束了对象无法被回收。
-
-
协程:
-
操作系统内核缺点:
慢: 上下文切换极其费时(1000 cycles)
大: 独立的方法栈需要很多空间。
需要发起系统调用,在内核态和用户态之间切换。
-
协程:
快: 始终占用CPU,在用户态。
小: 可以方便的实现上百万的并发度。
-
解决的问题:
多线程调度较慢,占用资源多的问题。
-
不解决的问题:
多线程中最主要的问题: 并发问题 — 死锁/竞争条件。
-
😆😆持续更新中~~~😆😆