如果另一个线程持有cInstance,ActivityA会出现内存泄漏吗? 代码如下:
案例1:
class ActivityA{
private void doSomething(){
ClassB.doSomething();
}
}
class ClassB{
public static void doSomething(){
ClassC cInstance = new ClassC();
//another thread holds cInstance
}
}
class ClassC{}
案例2:
class ActivityA{
private void doSomething(){
ClassB.doSomething(new ClassC());
}
}
class ClassB{
public static void doSomething(ClassC cInstance){
//another thread holds cInstance
}
}
class ClassC{}
答案 0 :(得分:0)
在情况1中,“另一个线程”不可能“保持cInstance”,因为该实例是在被调用方法的范围内私有创建的(并且在被调用方法的出口处变为不可见,因此符合GC的条件) )。
在情况2中,“另一个线程”不可能“保持cInstance”,因为该实例是在调用方法的范围内私有创建的(并且变为不可见,因此符合GC的条件),在调用的出口处法)。
在任何一种情况下,如果在调用/调用方法的代码中显式传递对cInstance的引用,并且该代码导致其他线程持有对cInstance的引用,则cInstance将在需要时保留,但是这不会影响对A类和/或B类实例的引用计数(除非C类明确地具有这样的引用)。
C类通过定义持有此类引用的一种情况是,在类A / B中将类C声明为类型为Class的实例成员。在这种情况下,C实例只能存在于[A / B]实例的上下文中,并且C实例持有对A / B成员的引用,因为这就是语言的定义方式。但这些技术相当先进,所以也许你可能暂时忽视这些可能性。
答案 1 :(得分:-1)
我们可以看到cInstance在doSomething静态方法中实例化,所以它在静态环境中。除此之外,ClassB不是ActivityA的内部类,它不会继续引用ActivityA。所以,我认为线程持有cInstance没有理由导致ActivityA上的泄漏内存