要想弄明白方法名中的LI、LIF、LPw、LPr的含义,需要先了解PackageManagerService内部使用的两个锁。因为LI、LIF、LPw、LPr中的L,指的是Lock,而后面跟的I和P指的是两个锁,I表示mInstallLock
同步锁。P表示mPackages
同步锁。LPw、LPr中的w表示writing,r表示reading。LIF中的F表示Freeze。
mPackages
同步锁,是指操作mPackages
时,用synchronized (mPackages) {}
保护起来。mPackages
同步锁用来保护内存中已经解析的包信息和其他相关状态。mPackages
同步锁是细粒度的锁,只能短时间持有这个锁,因为争抢mPackages
锁的请求很多,短时间持有mPackages
锁,可以让其他请求等待的时间短些。
mInstallLock
同步锁,是指安装App的时候,对安装的处理要用synchronized (mInstaller) {}
保护起来。mInstallLock
同步锁,用来保护所有对installd
的访问。installd
通常包含对应用数据的繁重操作。
由于installd
是单线程的,并且installd
的操作通常很慢,所以在已经持有mPackages
同步锁的时候,千万不要再请求mInstallLock
同步锁。反之,在已经持有mInstallLock
同步锁的时候,可以去请求mPackages
同步锁。
注意:不允许的情况:
synchronized (mPackages) {
synchronized (mInstaller) {// 这种情况是不允许的。因为Install的处理时间会很长,导致对mPackages锁住的时间加长,会使得其他对mPackages操作的请求处于长时间等待。
}
}
允许的情况:
synchronized (mInstaller) {
synchronized (mPackages) {// 这种情况是允许的。因为mPackages处理完之后,其他对mPackages操作的请求可以对mPackages处理,不需要等待太久。// 由于处理Install的时间本身很长,synchronized (mPackages)又较快,所以不会对原本长时间持有mInstaller锁的情况有大的影响。
}
}