我应该将变量声明为线程还是在Android中创建全局?

时间:2013-11-13 12:49:29

标签: java android multithreading global-variables

在Android中,公共类中的全局变量有什么用,或者在一个线程中声明它?

我实现了线程 a very good Thread,这里,每次触发线程时都会声明String updateWords

那么,这会影响记忆吗?

我宣布不。变量,所以,我在问。

任何帮助将不胜感激。 谢谢。

5 个答案:

答案 0 :(得分:2)

当备选方案远远更糟时,你应该只使用全局变量。

启动线程比创建对String的引用要贵1000倍。如果您担心使用单个字符串,甚至是少数字符串,则根本不应该创建一个线程。

即使你有几千个字符串,他们将使用与全局变量相同的内存量,因为它们使用局部变量。唯一的区别是全局变量使用堆,局部变量使用堆栈和堆,大部分用法仍在堆上。

答案 1 :(得分:0)

良好的面向对象编程通常会避开“全局”变量,而是倾向于将变量封装在对象中。有些时候可以打破,就像你有常量或其他东西一样,但有一些模式。

那就是说,是的,如果你创建多个线程,每个线程都有自己的updateWords,那么你将创建更多的对象,从而更多的垃圾收集。但是,由于updateWords是一个String,如果它在所有线程中设置为相同的值,则Java应该只创建一个String,因为String在Java中是文字的。

答案 2 :(得分:0)

创建一个公共静态属性,并在Main Class上初始化,如下所示:

public class foo {
    public static final string name = "Stack Overflow";
}

答案 3 :(得分:0)

只要线程没有被破坏,就会消耗内存。查看字符串是否是您的类的属性(根据面向对象的设计)。

答案 4 :(得分:0)

Java(和其他语言)中有几个用于各种任务的内存区域。

  1. 最昂贵的是堆内存,基本上所有使用new关键字创建的内容都会转到堆中。

  2. 然后就是堆栈,可以说是一个本地“堆”,但没有与堆变量创建相关的大部分成本,因此更快。几乎所有局部变量如updateWords都位于堆栈中。

  3. 寄存器是处理器内部变量,闪电般快速。 JVM优化器总是试图在适合的时候将内容放入内部寄存器,但由于寄存器的数量非常有限,只有非常频繁使用的变量才会存在。

  4. 但是昂贵意味着堆和寄存器之间的执行时间差为0.0000000001秒。

    然后,在声明本地String或任何Object:指针时,您应该知道实际保留了什么。实际上是一个32/64位“整数”,它保存实际找到String / Object的位置。所以指令String updateWords = updateAuto();创建一个新字符串,也不会将其复制到任何地方,所有发生的事情是updateAuto()函数返回一个指针(“整数”)并且updateWords设置为值。这和编写int updateWords = 42一样快,并且如果优化器感觉完全在堆栈甚至寄存器上完成。

    通常,您应该更多地关注可见性以及最方便/产生最少错误的应用程序,而不是内部组织内存的错误。一次手动优化通常会使你的应用程序速度提高不超过0.0000001%,而在保留内存时唯一要做的事就是在这样的循环中毫无意义地执行:

    for (int i = 0; i < 1000; ++i) {
      new MyReallyStupidMemoryWastingObject();
    }
    

    但即使是由垃圾收集器优雅地处理(只要你不通过将它们放在列表或类似的东西中来保存所有这些指针)。

    因此:使用全局变量可以简化代码并减少错误。示例是全局常量,如枚举或广泛使用的字符串关键字。否则使用本地或类本地变量并依赖JVM来正确地执行操作。

    一个常见的事情是给JVM一个使用单词final的用法提示。这允许JVM对此变量进行完全优化,甚至通过将其放入寄存器中来完全删除它,因为它知道您永远不会更改它。