一、同步机制
保证共享资源的读写安全,需要一种同步机制:用于解决2方面问题:
- 线程间通信:线程间交换信息的机制
- 线程间同步:控制不同线程之间操作发生相对顺序的机制
二、同步机制-管程
2.1 认识管程
同步机制中有经典的管程方案,关于管程在在中国大学mooc中搜索 管程 有些大学的操作系统课程会讲解管程。管程其实就是对共享变量以及其操作的封装:
- 将共享资源封装起来,对外提供操作这些共享资源的方法。
- 线程只能通过调用管程中的方法来间接地访问管程中的共享资源
2.2 管程如何解决同步和通信问题:
-
同步问题:
- 管程是互斥进入,管程提供了入口等待队列:存储等待进入同步代码块的线程
- 管程的互斥性是由编译器负责保证的。
-
通信问题: 管程中设置条件变量,等待/唤醒操作,以解决同步问题。
- 条件变量(java里理解为锁对象自身)
- 等待操作:可以让进程、线程在条件变量上等待(此时,应先释放管程的使用权,不然别其它线程、进程拿不到使用权);将线程存储到条件变量的等待队列中。
- 发信号操作:也可以通过发送信号将等待在条件变量上的进程、线程唤醒(将等待队列中的线程唤醒)
2.3 关键数据结构和方法:
- 线程队列:
- 入口等待队列:存储等待进入同步代码块的线程;线程进入管程后,可以执行同步块代码。java中的_EntryList
- 条件等待队列:入口等待队列中的线程,进入管程后,执行同步块代码的过程中,需要等待某个条件满足之后,才能继续执行,就将线程放入此变量的等待队列中。java是