编程语言
首页 > 编程语言> > java – 由于GC在线程情况下最终阻止跳过?

java – 由于GC在线程情况下最终阻止跳过?

作者:互联网

说(可能在一个单独的线程上)我正在运行一些方法ClassA.foobar().
在这个方法里面是一个尝试,(可能是捕获),最后阻止.

现在,如果执行仍在try-block(或catch-block)中间时,对此ClassA对象(或此线程)的最后一次引用会丢失,那么此对象(/ thread)是否可以在我获取之前进行垃圾回收到了最后一块?换句话说:即使没有对内存中剩余的对象(/ thread)的强引用,finally块仍然可以保证运行吗?

(我不知道GC如何处理孤立的活线程.)

虚拟的例子:

[Some context]
{
    ClassA classA = new ClassA();
     //Point is this instance and a reference to it exists

    class ClassA
    {
        public void foobar()
        {
            try
            {
                classA = null;
                 //Point is that the last reference to this instance is lost,
                 //and that this happens at this point in foobar() execution.
                 //The actual location of this line of code is irrelevant.
            }
            finally
            {
                //some important stuff here!
            }
        }
    }
}

解决方法:

In other words: is the finally block still guaranteed to run even if there are no strong references to the object(/thread) left in memory?

是.最后块不会像这样被跳过 – 也没有任何其他代码.

执行线程不是垃圾收集意义上的对象.区分线程本身和表示它的java.lang.Thread对象很重要 – 虽然我不认为Thread对象在线程终止之前会被垃圾收集.

特别是,完全有可能让线程没有对runnable或系统中任何其他内容的引用,并且线程可以继续运行.例如:

new Thread(new Runnable() {
    @Override public void run() {
        for (int i = 0; i < 1000; i++) {
             System.out.println(i);
        }
    }
}).start();

线程启动后,调用代码没有引用创建的匿名类的实例,也没有引用Thread对象 – 但它仍然会打印所有1000个数字.

标签:java,try-catch-finally,garbage-collection,thread-safety,finally
来源: https://codeday.me/bug/20190529/1176170.html