Android framework 有大量使用synchronized/lock(wait/notify/notifyAll),最近有看到一些文件的lock机制,Google有改进,方法很巧妙,另外自己理解的也不是很透彻,希望能得到同友的指点。
首先抽象出Android中使用object lock的一个最典型的例子(具体的可以参考AOSP文件UsimPhoneBookManager.java)。
// 继承Handler,在Handler收到event的时候一般需要进行lock的notify的动作
public class AndroidSimpleLockManager extends Handler {
// 定义一个Object lock,下面的大部分逻辑都是操作mLock
private Object mLock = new Object();
// 定义一个EVENT,Hanlder需要处理
private static final int EVENT_LOAD_SIM_INFO_DONE = 1;
// 定义一个function,这个函数需要通过RIL.java的HIDL接口读取SIM卡的一些info
// 这个函数执行在非main thread
public void readInfoFromSIM() {
synchronized (mLock) {
mCi.loadInfoFromSIM(obtainMessage(EVENT_LOAD_SIM_INFO_DONE))
try {
mLock.wait();
} catch (InterruptedException e) {
}
}
}
@Override
public void handleMessage(Message msg) { // main thread执行
AsynResult ar;
switch(msg.what) {
case EVENT_LOAD_SIM_INFO_DONE:
ar = (AsyncResult) msg.obj;
if (ar.exception == null) {
// 存储读取到的内容
saveResult(ar.result);
}
synchronized(mLock) {
mLock.notify();
}
break;
}
}
}
最常用的基本就是上面的用法,定义一个Object作为lock,读取内容的时候或者做重要的事情需要异步完成的时候,就call一个function,之后进行wait(),等操作完成后,main thread收到event,进行notify,利用了message Handler实现的。上面的这种用法非常常见,但是有一个缺点,就是如果有多个类似readInfoFromSIM的功能函数,如果可以从不同的sub thread的call过来,那么就是有多个thread处于