线程 与 锁(基础知识点 详解)

线程,在我们之前的博文中《静态块 与 本地块》曾经提到过“线程安全性”问题,详细好学的同学,或者思维缜密的同学从那时起就已经对这个知识点产生了疑问。那么,本人将在这篇博文中讲解有关 线程 的相关知识点

那么,在讲解什么是线程前,本人先来讲解一下什么是“进程”:

进程:
一个多个程序,在一组数据上的一次执行过程,被称为进程

那么,现在,本人来展示一下进程的管理与调度机制:
为了更好地管理进程,我们将进程分为了5个不同的状态:创建态、就绪态、运行态、阻塞态 和 销毁态。

首先,本人先来介绍一下这五种状态的基本定义:

  1. 创建态:
    用new运算符和Thread类或其子类建立一个线程对象后,该线程对象就处于创建态。处于创建态的线程有自己的内存空间,通过调用start()方法进入就绪态。

  2. 就绪态:
    处于就绪态的线程已经具备了运行条件,但是还没有分配到CPU,因而将进入线程就绪队列,等待系统为其分配CPU。一旦获得CPU,线程就进入运行状态并自动调用自己的run()方法。

  3. 运行态:
    在运行态的线程执行自己的run()方法中的代码,直到调用其它方法而终止,或等待某资源而阻塞,或完成任务而销毁。

  4. 阻塞态:
    处于运行状态的线程在某些情况下,如执行了sleep()方法,或等待I/O设备等资源,让出CPU并暂时终止自己的运行,进入阻塞态。
    在阻塞状态的线程不能进入就绪队列。只有当引起阻塞的原因消除时,如睡眠时间已到,或等待的I/O设备空闲下来,线程便转入就绪态,重新到就绪队列中排队等待CPU。当再次获得CPU时,便从原来中止位置开始继续运行。

  5. 销毁态
    销毁态是线程生命周期中的最后一个阶段。线程销毁的原因有两个:

    1. 是正常运行的线程完成了它的全部工作;
    2. 是线程被强行终止运行,如通过stop()或destroy()方法来终止一个线程。

下图是这五种状态的转换关系:
在这里插入图片描述那么,对于上图,本人来做以下几点说明:

  • 进程创建后并不是立刻进入运行态,而实现进入就绪态,在就绪态的进程队列中,与其他进程一起竞争CPU
  • 只有处于就绪态的进程才有资格竞争CPU
  • 就绪态的进程,除了CPU以外,不需要等待其他计算机资源
  • 处于阻塞态的进程,只能由处于运行态的进程唤醒
  • 阻塞态进程被唤醒后进入就绪态,与就绪态队列内的进程一起竞争CPU
  • 一般地,有几个CPU,就能同时运行几个进程
  • 进程是在运行态时,将自己阻塞起来,使自己进入阻塞态的

那么,为什么本人要在讲 “线程” 之前先讲 “进程” 呢?
答曰:
线程是“轻量级”进程。
线程是由进程创建的,但是线程不会再另外申请计算机资源,所以说线程是“轻量级”进程。

既然线程不会另外申请计算机资源,那线程所使用的资源,又是从哪里来的呢?
答曰:
线程所使用的计算机资源,都是由进程申请的。

那么,现在本人来将一个知识点——临界资源
什么是临界资源呢?

临界资源:
多个线程共享数据”操作相关的代码段

那么,为了解决多线程竞争临界资源的情况,先人们专门提出了一个在我们今后的学习中都非常重要的知识点——“
那么,锁的作用范围是什么呢?
本人来通过一张图来解释说明一下:
在这里插入图片描述那么,现在本人来讲解一下上述的运行步骤:
假设A先执行,当其执行完“之前语句”后,时间片段未用完,当其进入“临界资源”之前,要先检查“锁的状态
若是“锁开状态”,A则先使锁变为“锁闭状态”,然后进入临界资源。
假设A在临界资源内运行的过程中,时间片段耗尽了,A进入就绪态,等待调度
这是若是B获得了执行权利,B运行完了“之前语句”,但B 的时间片段未耗尽,这时B遇到锁。
这时,B先检查“锁”的状态,发现锁处于“锁闭状态”,于是B进入“这个锁的阻塞队列”,当B没有A的唤醒前,B将不再执行任何代码。
这就意味着:A可以顺利地完成所有“锁内”的临界资源。当A运行完锁内的所有代码后,遇到’}’,将执行“开锁”操作,唤醒阻塞队列中的所有进程(这时B在其中)
B被唤醒后,与A一起竞争CPU
… …
这就是大概流程了
上述的过程大家也看到了,这个锁起到了很重要的作用——阻止两个进程同时对于”锁内“临界资源进行操作,实现了进程的 线程互斥 的操作

但是,在这里,本人要进行一点说明:

  • 锁必须是所有相关进程所共享的(即:这个锁能够被共享“临界资源”的所有有关线程辨别出)
  • 线程遇到“锁”时,一定要先查看“锁的状态”
  • 所有有关“锁”的查看、开锁、关闭操作,都是由JVM实现的

若是对上述知识点或代码有任何疑惑、意见或者建议,请在下方评论区提出,本人将尽早予以答复,觉得有所帮助的同学请留下小赞赞,谢谢!!!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是嵌入式线程相关的基础知识点: 1. 线程:线程是一组在同一进程中运行的执行流。在嵌入式系统中,线程可以轮流使用CPU时间片,从而实现并发处理。 2. 进程:进程是程序的执行实例。每个进程都有自己的地址空间、堆栈和全局变量,以及独立的系统资源,如文件描述符、信号处理器等。 3. 上下文切换:上下文切换是指操作系统从一个线程或进程切换到另一个线程或进程时,需要保存当前线程或进程的上下文,并恢复下一个线程或进程的上下文。 4. 互斥:互斥是一种用于保护共享资源的机制。当一个线程获得互斥时,其他线程将被阻塞,直到该线程释放。 5. 信号量:信号量是一种用于协调多个线程或进程之间的同步和通信的机制。它可以用来控制对共享资源的访问,也可以用于线程或进程之间的通信。 6. 任务:在嵌入式系统中,任务是指一种特殊的线程,它在系统启动时就开始运行,并一直运行到系统关闭。任务通常用于执行周期性任务,如数据采集、数据处理等。 7. 中断:中断是一种异步事件,它会打断当前线程或进程的执行,转而执行中断处理程序。在嵌入式系统中,中断通常用于处理硬件事件,如定时器、外部中断等。 8. 定时器:定时器是一种硬件设备,它可以在一定时间间隔内产生中断。在嵌入式系统中,定时器通常用于周期性任务的触发和时间戳的生成。 9. 状态机:状态机是一种模型,用于描述系统的行为。状态机由一组状态和转移条件组成,当系统的输入或内部状态发生变化时,状态机会根据当前状态和输入条件转移到下一个状态。 10. RTOS:RTOS是实时操作系统的缩写,它是一种专门用于嵌入式系统的操作系统。RTOS提供了丰富的线程管理和通信机制,以及实时调度和中断处理等功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值