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

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

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

互斥同步都需要什么呢?

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

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

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

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

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

以上都是什么?

以图来表示:

Java中的线程安全(2)之互斥同步的底层原理_第1张图片

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

  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中的线程安全(2)之互斥同步的底层原理_第2张图片

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

你可能感兴趣的:(Android,Notes,Android开发系列,android,安卓,多线程,互斥同步)