通过Android trace文件分析死锁ANR(2)

可以看到TID=24需要ActivityManagerService这个锁。再看TID=12线程的栈顶,PowerManagerService的isScreenOnInternal函数代码如下:
 
  private boolean isScreenOnInternal() {
        synchronized (mLock) {
            return !mSystemReady
                    || mDisplayPowerRequest.screenState != DisplayPowerRequest.SCREEN_STATE_OFF;
            }
 
    }


可以看到需要PowerManagerService的mlock这个锁。最后看TID=85线程的栈顶,同样在PowerManagerService里面,内部类DisplayBlankerImpl的toString函数:
 
        public String toString() {
            synchronized (this) {
                return "blanked=" + mBlanked;
            }
        }
 

这是在内部类DisplayBlankerImpl里面实现的,所以需要DisplayBlankerImpl这个锁。
 
对应的表格如下:
 

通过Android trace文件分析死锁ANR

                   
 
表一 各线程等待的锁情况

从表一来看,没有出现死锁现象,似乎并不是我们所想的那样。难道不是死锁?开始有点小怀疑自己了,难道别的原因导致的。也许只看调用堆栈的顶端可能不行,栈顶只能看出各线程需要的锁,不能仅看自己要什么吧!一味索取可不好!人不是这样做的!看一下整个的堆栈调用流程,看看自己拥有了那些锁。

linux

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/cd7dda13bc37dd7898a4c14d63f8aa3d.html