cInstance会保存ActivityA对象的引用吗?

时间:2016-02-03 07:16:08

标签: java android

如果另一个线程持有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{}

2 个答案:

答案 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上的泄漏内存