JAVA并发编程

83 阅读3分钟

进程和线程

进程:系统运行程序和操作系统分配系统资源的基本单位。

线程:比进程更小的执行单位,是进行系统调度的最小单位。

区别:

线程是进程划分成的更小的运行单位,一个进程可以包含多个线程。

同一进程中的线程共享进程的资源,相互影响,但进程之间一般是独立的。

线程执行开销小,通信简单,但不利于资源的管理和保护;进程正相反。

概念对比

并发和并行

并发:两个及两个以上的作业在同一 时间段 内执行。

并行:两个及两个以上的作业在同一 时刻 执行。

最关键的点是:是否是 同时 执行。

同步和异步

同步:调用之后要一直等待到返回结果之后调用才能返回

异步:调用之后可以直接返回,不用等返回结果

线程安全和线程不安全

线程安全指的是在多线程环境下,对于同一份数据,不管有多少个线程同时访问,都能保证这份数据的正确性和一致性

线程不安全则表示在多线程环境下,对于同一份数据,多个线程同时访问时可能会导致数据混乱、错误或者丢失。

创建线程的方式

继承Thread类 实现Runnable接口 重写run方法 实现Callable接口 重写call方法

线程的生命周期和状态

  • NEW: 初始状态,线程被创建出来但没有被调用 start()

  • RUNNABLE: 运行状态,线程被调用了 start()等待运行的状态。

  • BLOCKED:阻塞状态,需要等待锁释放。

  • WAITING:等待状态,表示该线程需要等待其他线程做出一些特定动作(通知或中断)。

  • TIME_WAITING:超时等待状态,可以在指定的时间后自行返回而不是像 WAITING 那样一直等待。

  • TERMINATED:终止状态,表示该线程已经运行完毕。

image.png

线程常用方法

死锁

死锁的必要条件

  • 互斥条件:该资源任意一个时刻只由一个线程占用。

  • 请求与保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放。

  • 不剥夺条件:线程已获得的资源在未使用完之前不能被其他线程强行剥夺,只有自己使用完毕后才释放资源。

  • 循环等待条件:若干线程之间形成一种头尾相接的循环等待资源关系。

如何预防死锁

  • 破坏请求与保持条件:一次性申请所有的资源。

  • 破坏不剥夺条件:占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源。

  • 破坏循环等待条件:靠按序申请资源来预防。按某一顺序申请资源,释放资源则反序释放。破坏循环等待条件。

volatile

synchronized

ReentrantLock

ThreadLocal

线程池

AQS