深入理解常见类
- 使用RefBase构造函数,进行强引用和弱引用。RefBase是一个重量级的引用计数控制类。
- sp构造完后,RefBase中影子对象的强引用计数变为1,且弱引用技术也变为1。sp析构后,强弱引用计数各减1;(4.4版本后,sp不在RefBase中,而是在StrongPointer中)
- wp化后,影子对象的弱引用计数将增加1,变为2;wp析构后,弱引用计数减1;
- 完全彻底地消灭RefBase对象,包括让实际对象和影子对象灭亡,这些都是由强弱引用计数控制的,另外还要考虑flag的取值情况。当flag为0时:
a) 强引用为0将导致实际对象被delete;
b) 弱引用为0将导致影子对象被delete; - wpA的promote函数是从一个弱对象产生一个强对象的重要函数;
- 由弱生强的关键函数是attemptIncStrong
- LIFETIME_WEAK下,强引用计数为0,而弱引用计数不为0的时候,实际对象没有被delete,只有当强引用计数和弱引用计数同时为0时,实际对象和影子对象才会被delete;
- LIFETIME_FOREVER的总结:
a) flags为0,强引用计数控制实际对象的生命周期,弱引用计数控制影子对象的生命周期。强引用计数减为0时,实际对象被delete。使用wp时要由弱生强,以免收到segmentfault信号;
b) flags为LIFETIME_WEAK,强引用计数为0,弱引用计数不为0,实际对象不会被delete。当弱引用计数减为0时,实际对象和影子会同时被delete。
c) flags为LIFETIME_FOREVER,对象将永不被delete,彻底摆脱弱引用计数的控制。 - LightRefBase是一个轻量级的引用计数控制类;
- void*返回任意类型的值的指针;
- mCanCallJava为true的目的,它创建的新线程将:
a) 在调用你的线程函数之前会attach到JNI环境中;
b) 线程函数退出后,它会从JNI环境中detach,释放一些资源; - threadLoap运行在一个循环中,它的返回值可以决定是否退出线程。
- Mutex是互斥类,用于多线程访问同一个资源的时候,保证一次只有一个线程能访问该资源。使用lock函数锁住区域,如果这块区域之前已被别人锁住,look函数则等待,知道可以进入这块区域为止,系统保证一次只有一个线程能lock成功。unlock以释放互斥区域。trylock函数只是尝试去锁住该区域,使用者需要根据trylock的返回值来判断是否成功锁住该区域。
- AutoLock是定义在mutex内部的一个类,用户如下:
a) 先定义一个Mutex,如Mutexxlook;
b) 在使用xlook的地方,定义一个AutoLook; - 由于C++对象的构造和析构函数都是自动被调用的,所以在AutoLock的生命周期内,xlock的lock和unlock也就自动被调用了。
- 原子操作,就是该操作绝不会在执行完毕前被任何其他任务或事件打断,也就说,原子操作是最小执行单位。
- g_flags++生成的汇编指令:
a) 从内存中取数据到寄存器;
b) 对寄存器中的数据进行递增操作,结果还在寄存器中;
c) 寄存器的结果写回内存; - Android系统中Java的应用程序和其他系统上相同,都是靠消息驱动来工作的,大致的工作原理如下:
a) 有一个消息队列,可以往这个消息队列中投递消息;
b) 有一个消息循环,不断从消息队列中取出消息,然后处理; - 线程和消息处理的流程如下:
a) 事件源把待处理的消息加入到消息队列中,一般是加至队列尾,一些优先级高的消息也可以加至队列头。事件源提交的消息可以是按键、触摸屏等物理时间产生的消息,也可以是系统或应用程序本身发出的请求消息;
b) 处理线程不断从消息队列头中取出消息并处理,事件源可以把优先级高的消息放到队列头,这样,优先级高的消息就会被首先处理。
c) Looper类,用于封装消息循环,并且有一个消息队列;
d) Handler类,封装消息传递、消息处理等接口; - Looper的作用:
a) 封装了一个消息队列;
b) Looper的prepare函数把这个Looper和调用perpare的线程绑定在一起了;
c) 处理线程调用loop函数,处理来自该消息队列的消息。 - 当事件源向这个Looper发送消息的时候,其实就是把消息加到这个Looper的消息队列里。
- Looper、Message、Handler的关系
a) Looper中有一个Message队列,里面存储的是一个个待处理的Message;
b) Message中有一个Handler,这个Handler是用来处理Message的; - dispatchMessage定义了一套消息处理的优先级机制,他们分别是:
a) Message如果自带了calllback处理,则交给callback处理;
b) Handler如果设置了全局的mCallback,则交给mCallback处理;
c) 如果上述都没有,该消息则会交给Handler子类实现的handlerMess来处理,需要从Handler派生并重载handlerMessage函数;