今天工作,对java的final变量的生命周期进行了一下研究。
直接看代码:
package com.test.xiaomi.myapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private A a2 = new A();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
test1();
test2(a2);
}
private void test1() {
final A a = new A();
new Thread() {
@Override
public void run() {
a.a ++;
}
}.start();
}
private void test2(final A a1) {
t2 = new Thread() {
@Override
public void run() {
a1.a ++;
}
};
t2.start();
}
private static Thread t2;
private class A {
public int a =0;
}
}
直接给结论:
test1函数中,a的内存是线程跑完被释放,而a1不会被释放,很可能造成内存泄露。
理由:
反编译进行研究后,发现匿名内部类(那两个new的thread),会将final的变量当成自己的一个成员变量保存。
a还好,因为线程跑完就可以被gc。
而t2线程是static的,导致会一直有一个引用引向a1堆中的内存,不会被GC。