多线程与高并发(一)--线程的概念、锁

线程的历史

  线程的历史是异步对于CPU性能压榨的历史。

  • 单进程人工切换
    • 纸带机
  • 多进程批处理
    • 多个任务批量执行
  • 多进程并行处理
    • 把程序写在不同的内存位置上来回切换
  • 多线程
    • 一个程序内部不同任务的来回切换
    • selector  epoll
  • 纤程/协程

    • 绿色线程,用户管理的(不是OS管理的)线程

 什么是进程、线程、程序?

  • 程序
    • 操作系统可执行文件(QQ.exe)
  • 进程
    • 双击可执行文件之后,程序开始运行。操作系统找到可执行文件,将相关信息load到内存中,此时内存中有一个正在执行的QQ.exe。在内存中的每一份程序就是一个进程。操作系统会为每一个进程分配相关的资源,比如内存空间、文件描述符等。所以,进程是操作系统进行资源分配的基本单位。
  • 线程
    • 通俗角度
      • 一个程序里不同的执行路径就是线程。多线程是一个程序执行时会产生分支,多个分支同时运行就是多线程
    • 底层角度
      • 执行一个程序时,以线程为单位开始执行。操作系统会找到主线程,如果在主线程中开启了其他线程,会开始线程之间的切换。线程是调度执行的基本单位。多个线程共享同一个进程中所有的资源。

线程的启动方式

  1. 继承Thread,重写run方法。
  2. 实现Runnable接口,重写run方法。
  3. 使用lambda(第二种方法的变形)。
  4. 使用线程池启动线程(本质也是前两种方式之一)。

线程的状态

  状态是由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状态
    • 执行结束

  1. 锁的概念
    • 本质上锁的是对象。JVM规范没有实现要求,Hotspot是在对象头上拿出来两位(一共64位)来记录对象是否锁定。
  2. 锁的特性
    • synchronized方法等同于synchronized(this)。
    • synchronized静态方法是synchronized(T.class)。
    • 既保证的原子性,又保证了可见性(不需要加volatile)。
    • 可重入锁:如果不可重入会发生死锁。父类中有一个synchronized方法m,子类中重写并在方法中调用super.m(),如果不可重入,会死锁(还是同一把锁,锁定的是子类对象,子类维护了一个指向父类对象的super指针)。
    • 注意:使用synchronized时,不能用String常量,Integer,Long。

异常与锁

  程序在执行过程中,如果出现异常,默认情况锁会被释放,因此要非常小心的处理同步业务逻辑中的异常。

posted @ 2021-02-03 21:31  January01  阅读(21)  评论(0)    收藏  举报