5.6 互斥锁和条件变量的封装
类图
该类是封装了互斥锁的一些基本操作,包括互斥锁的初始化、销毁、上锁、解锁等功能。但是实际上使用RAII技术又封装了一个类,那就是MutexLockGuard。这主要也是采取了类似智能指针的封装思路,让互斥锁的生命周期交给操作系统去管理,释放的时机由操作系统管理,防止程序员忘记释放导致内存泄漏。
条件变量
条件变量是必须和互斥锁配合使用。waitForSeconds(int)这里主要是用来判断是否超时。
//伪代码
mutex上锁while(条件){wait//上锁->等待条件变量->加锁。这里的上锁和解锁是为了保证条件变量的操作是线程安全的}
mutex解锁
CountDownLatch,这是对条件变量的封装。既可以用于所有子线程等待主线程发起执行命令(notifyAll),也可以用于主线程等待子线程初始化完毕才开始执行。
API分析:
/*
countDown()计数器减为0时,唤醒所有阻塞在条件变量的线程
getCount():获取当前计数器
*/
5.7 缓冲区的封装。
主要分为了无界缓冲区(BlockingQueue)和有界缓冲区(BoundedBlockingQueen)。本质上是一个生产者-消费者问题中充当仓库的一个角色。
API接口:
/*
put:生产者将产品放到队列,注意需要上锁,队列长度无限
take:消费者消费产品,需要互斥锁
*/
API接口:
/*
和无界的区别在于需要判断队列是否满了。并且队列是采用了环形缓冲区(类似循环队列)的方式。头部用来读取/消费,尾部用来写/生产
*/
5.8 ThreadPool
本质上是一个生产者-消费者问题。
类图:
API接口:
/*
run() : 往线程池中添加任务。
runInThread():执行任务
take():获取任务
*/
5.9 线程安全Singleton
类图:
/*
ponce:保证只能被执行一次
value:一个模板T指针
instance():返回一个单例指针
构造函数和析构函数都是私有的
inti()和destory()都是私有的,内部创建和内部销毁。
*/