多线程与高并发(一)--线程的概念、锁
线程的历史
线程的历史是异步对于CPU性能压榨的历史。
- 单进程人工切换
- 纸带机
- 多进程批处理
- 多个任务批量执行
- 多进程并行处理
- 把程序写在不同的内存位置上来回切换
- 多线程
- 一个程序内部不同任务的来回切换
- selector epoll
-
纤程/协程
- 绿色线程,用户管理的(不是OS管理的)线程
什么是进程、线程、程序?

- 程序
- 操作系统可执行文件(QQ.exe)
- 进程
- 双击可执行文件之后,程序开始运行。操作系统找到可执行文件,将相关信息load到内存中,此时内存中有一个正在执行的QQ.exe。在内存中的每一份程序就是一个进程。操作系统会为每一个进程分配相关的资源,比如内存空间、文件描述符等。所以,进程是操作系统进行资源分配的基本单位。
- 线程
- 通俗角度
- 一个程序里不同的执行路径就是线程。多线程是一个程序执行时会产生分支,多个分支同时运行就是多线程
- 底层角度
- 执行一个程序时,以线程为单位开始执行。操作系统会找到主线程,如果在主线程中开启了其他线程,会开始线程之间的切换。线程是调度执行的基本单位。多个线程共享同一个进程中所有的资源。
- 通俗角度
线程的启动方式
- 继承Thread,重写run方法。
- 实现Runnable接口,重写run方法。
- 使用lambda(第二种方法的变形)。
- 使用线程池启动线程(本质也是前两种方式之一)。
线程的状态
状态是由JVM管理,管理这些状态时要通过操作系统。
- new状态
- 刚刚创建
- Runnable状态
- 被线程调度器执行
- Ready状态:在CPU等待队列等待执行。
- Running状态:在CPU上执行时。
- 被线程调度器执行
- TimedWaiting状态
- 调用sleep,wait,join,parkNanos,parkUntil方法,时间结束进入Runnable状态。
- Waiting状态
- 调用wait,join,park方法,调用notify,notifyAll,unpark方法进入Runnable状态
- Blocked状态
- 等待synchronized代码块锁,获得锁进入Running状态。
- Terminated状态
- 执行结束
锁
- 锁的概念
- 本质上锁的是对象。JVM规范没有实现要求,Hotspot是在对象头上拿出来两位(一共64位)来记录对象是否锁定。
- 锁的特性
- synchronized方法等同于synchronized(this)。
- synchronized静态方法是synchronized(T.class)。
- 既保证的原子性,又保证了可见性(不需要加volatile)。
- 可重入锁:如果不可重入会发生死锁。父类中有一个synchronized方法m,子类中重写并在方法中调用super.m(),如果不可重入,会死锁(还是同一把锁,锁定的是子类对象,子类维护了一个指向父类对象的super指针)。
- 注意:使用synchronized时,不能用String常量,Integer,Long。
异常与锁
程序在执行过程中,如果出现异常,默认情况锁会被释放,因此要非常小心的处理同步业务逻辑中的异常。

浙公网安备 33010602011771号