标签:min 目标 size 进程 arc 成员 name 内部实现 smart
Found one Java-level deadlock: ============================= "mondrian.rolap.RolapResultShepherd$executor_160": waiting to lock monitor 0x0000000043b2bf70 (object 0x0000000702080db0, a mondrian.rolap.MemberCacheHelper), which is held by "mondrian.rolap.RolapResultShepherd$executor_152" "mondrian.rolap.RolapResultShepherd$executor_152": waiting to lock monitor 0x00007f4e6c0751c8 (object 0x0000000702081270, a mondrian.rolap.MemberCacheHelper), which is held by "http-8182-11" "http-8182-11": waiting to lock monitor 0x0000000043b2bf70 (object 0x0000000702080db0, a mondrian.rolap.MemberCacheHelper), which is held by "mondrian.rolap.RolapResultShepherd$executor_152"
at mondrian.rolap.SmartMemberReader.flushCacheSimple(SmartMemberReader.java:577)
- waiting to lock <0x00000007020a8990> (a mondrian.rolap.MemberCacheHelper)
at mondrian.rolap.RolapCubeHierarchy$CacheRolapCubeHierarchyMemberReader.flushCacheSimple(RolapCubeHierarchy.java:883)
at mondrian.rolap.RolapCubeHierarchy.flushCacheSimple(RolapCubeHierarchy.java:458)
at mondrian.rolap.MemberCacheHelper.flushCache(MemberCacheHelper.java:166)
- locked <0x00000007020a8e50> (a mondrian.rolap.MemberCacheHelper)
at mondrian.rolap.RolapCubeHierarchy$CacheRolapCubeHierarchyMemberReader.flushCache(RolapCubeHierarchy.java:878)
at mondrian.rolap.RolapCubeHierarchy.flushCache(RolapCubeHierarchy.java:451) @Override
public void flushCache(){
super.flushCache();
rolapCubeCacheHelper.flushCache();
}
public void flushCache(){
synchronized( cacheHelper){
cacheHelper .flushCache();
}
}
// Must sync here because we want the three maps to be modified together.
public synchronized void flushCache() {
mapMemberToChildren.clear();
mapKeyToMember.clear();
mapLevelToMembers.clear();
if (rolapHierarchy instanceof RolapCubeHierarchy){
((RolapCubeHierarchy)rolapHierarchy ).flushCacheSimple();
}
// We also need to clear the approxRowCount of each level.
for (Level level : rolapHierarchy.getLevels()) {
((RolapLevel)level ).setApproxRowCount(Integer. MIN_VALUE);
}
}
public void flushCacheSimple(){
super.flushCacheSimple();
rolapCubeCacheHelper.flushCacheSimple();
}
public void flushCacheSimple(){
synchronized(cacheHelper){
cacheHelper.flushCacheSimple();
}
}
最后进入flushCacheSimple方法,这彻底凌乱了:
public synchronized void flushCacheSimple() {
mapMemberToChildren.clear();
mapKeyToMember.clear();
mapLevelToMembers.clear();
// We also need to clear the approxRowCount of each level.
for (Level level : rolapHierarchy.getLevels()) {
((RolapLevel)level).setApproxRowCount(Integer.MIN_VALUE);
}
}
B线程可能在运行super.flushCache进入这个函数意味着须要持有父类的helper,可是当它运行flushCacheSimple的时候有须要申请当前类的helper对象的锁。于是就造成了死锁。
标签:min 目标 size 进程 arc 成员 name 内部实现 smart
原文地址:http://www.cnblogs.com/liguangsunls/p/7136843.html