Java中的线程安全(2)之互斥同步的底层原理

Java中的线程安全(2)之互斥同步的底层原理

本来在理解完互斥同步之后,应该开始扒一扒Lock的源码了,但是在真正进入源码阶段之前,需要先按照常人的思维去理解一下,如果,让我们自己实现一个这样的互斥同步,我们该如何实现互斥同步呢?

互斥同步都需要什么呢?

首先,我不是所有代码都需要互斥访问,那么在需要互斥访问的地方,我需要有一个标记,证明我的代码是要互斥访问的。

其次,我需要一个标志位,来控制这段互斥访问的代码,是否正在被别的线程访问着。

如果多个线程都想要访问这段代码,需要一定的机制,让非正在访问的线程进入等待状态(也可以是阻塞状态),防止CPU资源消耗过多。

在一个线程在执行时,可以主动放弃自己的执行状态,等待其他线程重新唤醒来执行。

同时就需要存在一个功能,来通知处于等待状态的线程,重新执行。

以上都是什么?

以图来表示:

在这里插入图片描述

其实上面的图很粗糙,但是按照最基本的设想来说,一个互斥同步的实现方案至少需要以下东西:

  1. 锁:需要控制只有一个线程能进入临界区。
  2. 等待队列(或者阻塞):在拿不到锁的时候,要怎么处理,常规方案可以是,进入等待队列,等待锁被释放。
  3. 通知等待线程退出等待状态的工具
  4. 让线程进入等待状态的工具
  5. 用于标记当前已经拿锁线程的变量

对应到Java中都是什么?

1、锁:Monitor、Lock
2、等待队列:Monitor内部,Lock内部的队列
3、通知工具:notify(Monitor对象)、signal(Condition对象)
4、进入等待工具:wait(Monitior对象)、wait(Condition对象,最终调用LockSupport工具)
5、标记当前拿锁线程:Lock:exclusiveOwnerThread

所以就有了Java线程的状态转换图啦

在这里插入图片描述

实际上,Java本身是不提供多线程方案的,最终还是要通过调用系统级别的线程相关操作才可以。所以说,更底层的关于如果暂停一个Thread,如果让Thread进入等待状态恢复,这里就不多讲了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值