进程和线程
进程:系统运行程序和操作系统分配系统资源的基本单位。
线程:比进程更小的执行单位,是进行系统调度的最小单位。
区别:
线程是进程划分成的更小的运行单位,一个进程可以包含多个线程。
同一进程中的线程共享进程的资源,相互影响,但进程之间一般是独立的。
线程执行开销小,通信简单,但不利于资源的管理和保护;进程正相反。
概念对比
并发和并行
并发:两个及两个以上的作业在同一 时间段 内执行。
并行:两个及两个以上的作业在同一 时刻 执行。
最关键的点是:是否是 同时 执行。
同步和异步
同步:调用之后要一直等待到返回结果之后调用才能返回
异步:调用之后可以直接返回,不用等返回结果
线程安全和线程不安全
线程安全指的是在多线程环境下,对于同一份数据,不管有多少个线程同时访问,都能保证这份数据的正确性和一致性。
线程不安全则表示在多线程环境下,对于同一份数据,多个线程同时访问时可能会导致数据混乱、错误或者丢失。
创建线程的方式
继承Thread类 实现Runnable接口 重写run方法 实现Callable接口 重写call方法
线程的生命周期和状态
-
NEW: 初始状态,线程被创建出来但没有被调用
start()。 -
RUNNABLE: 运行状态,线程被调用了
start()等待运行的状态。 -
BLOCKED:阻塞状态,需要等待锁释放。
-
WAITING:等待状态,表示该线程需要等待其他线程做出一些特定动作(通知或中断)。
-
TIME_WAITING:超时等待状态,可以在指定的时间后自行返回而不是像 WAITING 那样一直等待。
-
TERMINATED:终止状态,表示该线程已经运行完毕。
线程常用方法
死锁
死锁的必要条件
-
互斥条件:该资源任意一个时刻只由一个线程占用。
-
请求与保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放。
-
不剥夺条件:线程已获得的资源在未使用完之前不能被其他线程强行剥夺,只有自己使用完毕后才释放资源。
-
循环等待条件:若干线程之间形成一种头尾相接的循环等待资源关系。
如何预防死锁
-
破坏请求与保持条件:一次性申请所有的资源。
-
破坏不剥夺条件:占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源。
-
破坏循环等待条件:靠按序申请资源来预防。按某一顺序申请资源,释放资源则反序释放。破坏循环等待条件。