日期:2014-05-18  浏览次数:20766 次

将线程变量声明为静态和不声明静态有什么区别?
比如:

在类中这样声明:

private static Thread trd;



private Thread trd;

当然我知道变量是静态的,所以每次父类new的时候这个变量都是一个静态的值。
但是这样对线程运行,GC回收什么的有区别么?

请大家分析以上这样的区别都有哪些?越详细越好。



------解决方案--------------------
我认为没什么区别,前提是你把线程体管理好了(开始、暂停、...、结束)。
因为都私有嘛,只不过看成一个指针是否常驻在内存的区别。

------解决方案--------------------
主要 的区别就是:private static Thread trd;这个东西在系统运行加载类的时候变量就会被赋值。
------解决方案--------------------
帮顶!我只知道静态变量可以用来保存全局的一些值。。
------解决方案--------------------
静态变量数属于“类”的 而实例变量是属于“对象的” 每个实例对象new的时候都有一个指针指向他的type类 也就是这个类的元数据 你的静态变量也就放在那里 不受GC管的
我不知道这么理解是否正确 静态变量其实是元数据的一部分 而实例变量是数据 元数据自然就不受GC管
------解决方案--------------------
静态的是单线程(相对下边的来说,不是说项目只有一个线程) ------------ 只有一个实例
实例的是多线程-----------------每个对象都可以有自己单独的线程
------解决方案--------------------
偶也不懂,看看大牛们的解释.
------解决方案--------------------
前者基本上是这个类的所有实例的某个方法,都可以交给这个static的线程来执行吧

后者基本上是一个实例的一个方法,只能叫给自己实例的一个线程

这个还是看设计的问题需要把,如果所有该类的所有实例都需要用一个单一的线程来执行,那选static
否则可以选非static得
------解决方案--------------------
4楼感觉已经很清楚了,一个是在这个类的对象失去所有引用随着对象销毁,静态的应该是在程序结束时销毁吧
------解决方案--------------------
但是这样对线程运行,GC回收什么的有区别么?

我回答这个,
静态引用变量可以作为GC的根,会长期贮存随代机制存留而不回收,只有当该应用程序退出才会被系统GC,所以一般而言列表或集合尽量不要使用静态全局却不断添加元素很容易内存耗用膨胀因GC无法施展