入坑准备
一、一些基本概念
1、线程是什么
线程(英语:thread)是操作系统能够进行运算调度的最小单位。
2、进程是什么
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
3、线程与进程的关系
线程是进程实际的执行单位
4、线程的切换
从JVM上来理解,JVM的运行时内存区-
PC:程序计数器(线程私有)
假设线程A执行到一半,突然切换到线程B。等B分配的执行时间结束后。怎么知道A执行到哪里了?--从PC得知
从内存模型来理解:
工作内存是独立的,所以线程之间的数据其实是独立的。但实际上线程可能会调用到静态变量,这部分的数据是可以多个工作线程读写的。
5、单核CPU设定多线程是否有意义
多线程概念-并发。与并行不同,并行就像是杨过和小龙女一起使出玉女剑法;并发就是小龙女自己左右互搏。。。。
所以,你如果问我单核CPU搞并发有没有用?那我问你,小龙女自己单手用招能不能打过全真教那几位道士?
严肃点。。。
计算机的性能制约点:IO、计算。IO又分很多种:内存、硬盘、网络、CPU缓存
假设在读硬盘的时候很慢,我是不是能在这个时候先去干点别的。而不要让程序呈现假死的情况?
这样可能还不是那么好理解,我们假设 A系统在调用B系统,此时B系统(具备独立计算、IO能力,需要10秒才能返回结果)。那么你希望A系统就卡在这10秒吗?
6、线程数是不是越大越好
这就涉及性能极限值了,首先肯定不是越大越好。但是要找到合适的线程数,需要通过压测。
7、线程数的选择
压测,有个教授的公式。总体上要先看当前系统是偏向计算型还是IO型,一般IO型可能就不需要选择太多的线程数,计算型的可能就需要多分配些,但也不是绝对的
8、创建线程的几种方式
。。。其实个人认为只有一种,new Thread。
执行线程的多种方式的话:
new Thread().start()
new Runable(),最终用线程对象或线程池承载执行
new Callable(),有返回对象的Runable
二、线程状态
- NEW
- Runable
- TERMINATED
- Wating (LockSupport.park())
- TimedWating
- Blocked(Synchronized)
三、线程打断
- stop【过时】
- interrupt、interrupted
- suspend(暂停),resume(恢复)
四、并发三大特性
- 可见性 - 其他线程可见,数据可共享
- 有序性 - 执行不可乱序
- 原子性 - 全部成功,全部失败
五、锁升级
偏向锁(门上写个纸条,有人在上厕所)-》自旋锁 - 很多人都想上厕所(在门外转悠,看啥时候能轮到自己)-》重量级锁 - 非常多人来或者一直有人插队(厕所所长来安排)
六、ThreadPool
- Single,有序
- Fix,固定线程数
- Cache,无边界
- Schdule,定时
七、TPE源码
- CAS,线程数量和状态通过一个原子变量的高低位来控制
- 五种状态:
- Running 运行中
- Shutdown 关机
- Stop 停止
- Tidying 整理
- Terminated 终止