除了互斥体类型 PRLock 之外,NSPR 还提供了一种特殊类型 PRMonitor,用于 Java 编程。本章介绍用于创建和操作类型为 PRMonitor 的互斥体的 NSPR API。

对于类型为 PRLock 的互斥体,单个线程只能在退出之前进入监视器一次,并且互斥体可以有多个关联的条件变量。

对于类型为 PRMonitor 的互斥体,单个线程可以根据需要多次重新进入监视器。线程第一次进入监视器时,它会获取监视器的锁,并且线程的进入计数会递增到 1。线程每次随后成功进入同一个监视器时,线程的进入计数都会再次递增,并且每次线程退出监视器时,线程的进入计数都会递减。当线程的进入计数达到零时,线程会释放监视器的锁,并且之前在尝试进入监视器时被阻塞的其他线程将被重新调度。

调用 PR_Wait 会暂时将进入计数返回到零。当调用线程恢复时,它具有与等待操作之前相同的进入计数。

与类型为 PRLock 的互斥体不同,类型为 PRMonitor 的互斥体只有一个隐式关联的条件变量,可用于促进线程与监视数据状态变化的同步。

有关 NSPR 线程同步(包括锁和条件变量)的介绍,请参见 NSPR 简介

监视器类型

除了 PR_NewMonitor(它创建一个新的监视器对象)之外,所有监视器函数都需要指向类型为 PRMonitor 的不透明对象的指针。

监视器函数

所有监视器函数都是线程安全的。但是,此安全性不扩展到保护监视器对象免于删除。