入坑准备


一、一些基本概念

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 终止