同步机制
经典实现
信号量
信号量与PV原语操作由Dijkstra发明,也是使用最广泛的互斥方法之一。它包含以下几个元素:
- Semaphore S(信号量)
- Operation P,有时也表达为wait()
-
Operation V, 有时也表达为signal()
Semaphore S用于指示共享资源的可用数量,P原语可以减小S计数,V则增加它的计数。由此可知当某个进程想进入共享区,首先要执行P操作;同理,想退出共享区时执行V操作。
PV操作图
Mutex
Mutual Exclusion,其释义为互斥体。Mutex通常是对某一排他资源的共享控制——要么这个资源被占用(Lock),要么就是可以访问(unlock)。
管程(Monitor)
管程是可以被多个线程/进程安全访问的对象(Object)或者模块(module)。管程中的方法都是受mutual exclusion保护的,意味着着同一时刻只允许一个访问者使用它们。另外管程还具备如下属性:
- 安全性
- 互斥性
- 共享性
Android中的同步机制
Mutex
Android中的Mutex只是对pthread提供的API的简单再封装,另外Mutex中还包含一个AutoLock的嵌套类,它利用变量生命周期特点而设计的一个辅助类。
Mutex既可以实现进程内的永不,也可以解决进程间同步问题。与Semaphore不同,Mutex只有两种状态,即0和1。当调用者希望访问临界资源时,它必须先通过lock()来获取资源锁。如果此时资源可用,这个函数立马返回;否则,会进入阻塞等待,知道有人释放了资源锁并唤醒它。释放资源锁调用unlock(),同时正在等待使用这个锁的其他对象会被唤醒,然后继续执行它的任务。另外Mutex还特别提供了一个tryLock()来满足程序多样化需求。这个函数会试探性地查询资源锁是否可用,在不可用的情况下,并不会阻塞,而是同样立即返回,只是返回值不为0。
Condition
Condition是“条件变量”在Android系统中的实现类,它是依赖Mutex来完成的。
Barrier
Barrier是同时基于Mutex和Condition实现的一个模型。是对Condition的一个应用,Barrier类是专门为SurfaceFlinger而设计的。
加解锁的自动化操作——Autolock
在Mutex类内部的Autolock嵌套类,实现了加、解锁的自动化操作。它的实现原理为:
当Autolock构造时,会主动调用内部成员变量mLock的lock()方法来获取一个锁。而在析构时,调用它的unlock()方法释放锁。这样假如一个Autolock对象是局部变量的话,那么它在生命周期结束时就会自动把资源解锁。
参考资料
- 深入理解Android内核设计思想. 林学森。