标题: 多线程问题2 求指教!!! [打印本页] 作者: 王海旺 时间: 2013-7-24 11:59 标题: 多线程问题2 求指教!!! 线程启动顺序以及什么时候资源共享 什么时候资源不共享???
这个是代码:
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;
线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程.
所有的线程虽然在微观上是串行执行的,但是在宏观上你完全可以认为它们在并行执行
线程的代码区是共享的,即不同的线程可以执行同样的函数。
所以当多个线程同时访问该代码段,改变代码段上的数据时,我们无法确切的知道数据的准确结果,因为我们无法知道某一时有哪几个线程访问了代码段,修改了数据 作者: liuzhming 时间: 2013-7-24 12:50
当我们通过start()方法开启这两个线程后,进程中将会有三个线程:主线程(即main线程)和两个匿名对象线程。它们的执行顺序是随机的,任意的,所以输出结果也是不确定的。如果全部按照每个线程执行完,再执行另外一个的方式运行,可能的结果有
(1)2
3
now a is :4
(2)2
now a is :3
4
(3)now a is :2
3
4
如果一个线程没有执行完,就转移到另一个线程执行,那么就可能有很多种结果。而楼主得到的第一种结果,就是这种情况下的一种结果。它的执行过程是:某个匿名线程完全执行,它将a自增,再把它打印,结束。然后主线程也将a自增,这时又转到另一个匿名线程内,将a也自增,然后把它打印,这个匿名线程也结束了。最后主线程执行时,因为自增a已经执行过了,就把它保存的a以前的结果3打印。static修饰的属性是静态的,是所有对象共享的。不加static修饰符的属性是对象独有的,所以第二个程序中的线程操作的是各自对象的a,将各自的a自增,打印的便是各自a的值。