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

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

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

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

那么,现在,本人来展示一下进程的管理与调度机制:
为了更好地管理进程,我们将进程分为了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实现的

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值