public class Test extends Thread {
private static int count = 0; private int countNumber = ++count; //*******请注意此处******** public void run() {
System.out.println("Thread" + countNumber + "[" + count + "]");
try{
Thread.sleep(3000);
}catch(Exception e){
e.printStackTrace();
}
} public static void main(String[] args) {
for (int i = 0; i < 4; i++) {
new Test().start();
}
}
}请教一个为何用*****号标记的地方countNumber改为static变量,结果完全不一样,每次创建一个线程他们共享成员变量吗?
private static int count = 0; private int countNumber = ++count; //*******请注意此处******** public void run() {
System.out.println("Thread" + countNumber + "[" + count + "]");
try{
Thread.sleep(3000);
}catch(Exception e){
e.printStackTrace();
}
} public static void main(String[] args) {
for (int i = 0; i < 4; i++) {
new Test().start();
}
}
}请教一个为何用*****号标记的地方countNumber改为static变量,结果完全不一样,每次创建一个线程他们共享成员变量吗?
解决方案 »
- 短信猫Linux平台JAVA二次开发包RXTX发送短信出现No response from devic异常
- JAVA多线程问题,求教
- 这样在外部定义对象有问题吗?
- 为什么要写 if (log.isDebugEnabled()) {}?
- 一个可用JCheckBox单选或复选的JTree组件,求教高手
- java中的字符串长度问题。
- 快来看!!jcom2.23(java-com bridge) + websphere3.5 + 线程的问题。
- 我是新手,对面向对象的编程概念不是很理解,类内部好像就是面向过程的,对主程序来说调用类才是面向对象的,我的理解对吗?
- 请教,如何将一个应用程序封装为一个.exe程序
- 一个困扰着我让我无法深入学习的障碍,应该是简单的,可是一时找不出解决办法。
- 关于String类的基本问题
- FILE操作代码如何改写成从ORALCE中BLOB取数据?
所以这些类共享的是count变量。如果countNumber不是共享的(static),那么在构造实例的时候,调用了++count,改变了count的值,然后赋值给countNumber。由于线程执行先后的不确定性,导致了各个实例的countNumber的不确定性。如果countNumber是static的,那么它也被所有的实例共享。即时线程执行先后不确定性存在,得到的结果也是确定的。个人简单理解:如果countNumber 不是static的,那么内存中有多个countNumber,如果countNumber 是static的,那么内存中只有一个countNumber。大家讨论,呵呵
=====================================================================================
一个线程也就是你new出来的一个你的线程类实例,和其他类的实例没什么不同,静态的就共享,非静态的就属于不同对象.
其他的cuilichen(fjfjfjfj)都说完了,赞同.
“private static int countNumber = ++count;”时,countNumber 始终为1
其他同意cuilichen(fjfjfjfj)
static 的变量只有在类加载的时候赋值(在代码中没有赋值语句)
“private static int countNumber = ++count;”时,countNumber 始终为1
===================================================================================静态变量植是可以改变的啊,否则成final Static了
static 的变量只有在类加载的时候分配一次内存并初始化
private static int countNumber = ++count;”时,countNumber为静态变量,所以他的植会随这个语句的调用而增加且所有线程对象共享.