public class Fire {

public static void doit(){
int j = 0;
for(int i=0;i<1000;i++){
j++;
try{
Thread.sleep(20);
}catch (Exception e) {
// TODO: handle exception
}
}
System.out.println(j);
}}public class Stone extends Thread{
public Stone(){}
public void run(){
Fire.doit();
}
}public class Test {

public Test(){}

public static void main(String []args){

Stone s[] = new Stone[100];
for(int i=0;i<100;i++){
s[i] = new Stone();
s[i].start();
}
}}
我测了一下,最后的结果没有互相影响,大家看看是不是我的测试代码不足够亚,我觉得静态方法只是在内存中共享同一段代码段,但执行起来方法里的局部变量都是各个线程自己的,所有部会互相影响的,不知道这么解释对不对,反正我们头告诉我为安全起见,全改成非静态的,他说的对马?

解决方案 »

  1.   

    你把public static void doit(){Thread.sleep(20);      
    换成Thread.yield();因为线成睡眠是带着对象锁一起睡眠的.
      

  2.   

    to soft1999(豆子1999) :    换成了yield,结果显示还是不干扰,yield好像是对于非抢占式系统说的,我Thread.sleep(20);的意思是想尽量让前面的线程等等后面的线程,让更多的线程都在同一个方法里执行,看会不会出问题.好像结果证明大家都拥有自己的i和j,因为我写了不少类似的代码,怕出问题,心里没底,明天代码就得交出去上线了,赫赫
      

  3.   

    代码里都是局部变量,没有共同使用(修改)的资源,怎么会相互干扰?线程同步跟是不是static没有关系。
      

  4.   

    简单介绍一下java多线程运行时,变量的共享问题。
    首先明确一定,不论是对象的属性还是局部变量在运行的线程中都有一个在私有拷贝,这样就不至于和别的线程冲突。
    函数内部的临时变量只有在函数运行时才有效,同步的时候各个线程间也不会有干扰,否则函数运行的上下文都受影响了程序还怎么运行。
    对于对象的属性,各个线程都可以访问,因此同步的关键就在这里。有了私有拷贝只有线程运行时可能会有脏数据的存在,及已经有线程改变了,但是其它线程还来不及感知。那么各个线程之间如何感知同一属性的改变呢?简单点说是在任何的同步方法执行之后各个线程的私有拷贝都会同步一次,所以多线程间能通过统一对象的属性共享数据。(同步方法除了用户显示的写出,在java的类库中也有大量的分布)
    对于静态属性和普通的属性差不多,唯一不同的是静态属性是在类的层次同步的,而普通属性是在对象的层次同步的。