当前位置:编程学习 > JAVA >>

java 多线程编程 线程启动顺序以及什么时候资源共享 什么时候资源不共享

这个是代码:
public class MyThread extends Thread {
static int a=1;
public void run(){
System.out.println(++a);
}

public static void main(String[] args) {
new MyThread().start();
new MyThread().start();
System.out.println("now a is :"+ ++a);
}
}
输出结果是:
2
4
now a is :3

但是如果把System.out.println("now a is :"+ ++a);这句和那个static修饰符删掉的话
public class MyThread extends Thread {
          int a=1;

public void run(){
System.out.println(++a);
}

public static void main(String[] args) {
new MyThread().start();
new MyThread().start();
}
}
输出结果就变成了:
2
2 --------------------编程问答-------------------- 谁能告诉我这是为什么呢? --------------------编程问答-------------------- new MyThread().start();//产生了一个对象
new MyThread().start();//这里也产生了一个对象,每个对象都有属于自己的成员变量,如张三和李四是两个对象,他们都有属于自己的age,name --------------------编程问答-------------------- --------------------编程问答-------------------- 这其实应该是两个对象的i值。也就是说其实实验二的结果应该是对的。
至于第一个,静态的对象会一直存在内存中,所以下一次取数的时候,会先从池中查找,如果存在就直接拿出来用了。造成了累加的现象。。
楼主可以试一下i=128以上的数字试一试,看看是不是还是这个结果。。
只是自己的理解方式,有可能不对,不对请指出,请谅解。
--------------------编程问答-------------------- public class MyThread extends Thread {
static int a = 1;

public void run() {
try {
sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(++a);
}

public static void main(String[] args) {
new MyThread().start();

new MyThread().start();

try {
sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("now a is :" + ++a);
}
}
这个可能是楼主想要的结果吧,额猜的~
其实有两点你要知道就知道为什么第一次输出奇怪的数据
1.static把a修饰成静态变量即大家都用这个a
2.多线程在cpu中其实就就是把线程分成很多个时间块,真正在一个时候运行的只有一个线程的一个时间块,所以我上面这个程序加上sleep()加大MyThread的时间块让你看清楚他们的执行顺序。
3.线程在你调用start方法之后开始启动,
4.关于资源共享问题我还不能说得很清楚(我刚学完javaSE,在练习javaSE的小项目),其中还有关于资源冲突的问题,消费者生产者的问题。建议系统学习线程~ --------------------编程问答-------------------- 补充:线程在你调用start方法之后开始启动,但是有多个线程摆在在cpu面前时,怎么划分时间块,执行的顺序由cpu决定~ 上述程序还可以设置线程的优先级解决顺序问题~ --------------------编程问答-------------------- 除 --------------------编程问答-------------------- new MyThread().start();
new MyThread().start();
2个线程 如果a有static修饰则a是共享的所有会有线程安全问题.
如果没有static修饰则a是2个线程对象各自的不共享没有线程安全问题。
总结:
非静态成员变量在单列的情况下是共享的有线程安全问题,在单列下建议使用局部变量避免线程安全问题如servlet
静态成员变量不管是不是单列都是共享的
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,