首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用线程安全针对本地和全局变量的Java垃圾收集

使用线程安全针对本地和全局变量的Java垃圾收集
EN

Stack Overflow用户
提问于 2015-03-06 05:55:33
回答 3查看 1.3K关注 0票数 4

下面哪个代码片段在时间上更有效

代码语言:javascript
复制
Class Test{...}

局部变量

代码语言:javascript
复制
private void function(){
   Test test = new Test();
    ....
}

全局变量

代码语言:javascript
复制
Test test = null; 
private void function(){   
   if(test == null){
     test = new Test();   
   } 
}

让假设函数()经常调用

编辑

你们都很好。回答得很好。现在我要说的是

CASE-1比CASE-2更高效,但另一方面,CASE-1并不是线程安全的。所以两者都有利与弊

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-06 06:08:24

在案例1中,会创建一个Test,并在每次调用时都有资格使用GC,这会产生大量的垃圾。在第二种情况下,它只创建一次,可能永远不是GCed。

为什么我们不总是使用选项2-它可能不是线程安全。让我们用SimpleDateFormat代替Test,而函数()将需要同步,否则它将无法在多线程应用程序中工作。同步也很昂贵。因此,我们需要决定哪一个选项是更好的新对象,每次或同步。

票数 2
EN

Stack Overflow用户

发布于 2015-03-06 06:03:36

如果构造函数有副作用,则两个选项执行两种不同的操作。

如果Test携带状态,则选项1和选项2也可能不再等效(选项2可能不是线程安全的)。

例如:许多人错误地使用Java的日期或数字格式对象(如选项2 ),这不太好,因为它们不是线程安全。

假设Test完全无状态,并且调用构造函数没有任何副作用(这两者您似乎都有暗示),那么选项3如何:

代码语言:javascript
复制
private static final Test test = new Test();

private void function(){
    .....
}

根本没有GC活动。

或者,如果Test确实携带状态,或者在某种程度上不具有线程安全性,并且您希望在一个紧循环中调用function,则选项4:

代码语言:javascript
复制
private void function(Test test){
}

void theCaller(){
    Test test = new Test();
    for (int i=0; i<10000; i++) {
       function(test);
    }
}

由于该方法是private,所以您可以使用一种不太方便的方式以性能的名义调用它。

票数 1
EN

Stack Overflow用户

发布于 2015-03-06 06:02:32

这取决于函数的使用和对象在问题集中要做什么。我总是说,只有在需要的时候才创建对象。没有理由让一个物体不被使用。如果您计划在函数之外使用该对象,您将希望首先将其初始化为null,然后在需要时创建该对象。

您不应该担心Java的垃圾收集效率。很有效率。只要你没有在100年代的时候创造出更多的动态对象,我就不会担心了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28893109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档