静态方法传入的参数在多线程下的状态

2017-03-23  本文已影响326人  senninha

静态方法传入的参数在多线程下的状态

静态方法的传入的参数在多线程环境会会不会互相干扰呢,比如:

    public static void test(String test){
        System.out.println(test)
    }

如果同时有多个线程使用这个静态方法,这里的字符串test在多线程环境下还会是当时传入的那个参数吗?

猜测是不会影响的。。这个是引用传递

代码里来试试:

/*
*这里静态方法里有一个String类型的参数,两个线程同时进行,传入不同的*String对象,然后让一个线程等待1s,打印结果
*/
public class StaticMethodTest implements Runnable{
    static int i = 0;
    
    @Override
    public void run() {
        // TODO Auto-generated method stub
        //随机生成字符串
        testStaticMethod(Math.random()+ "");
    }
    
    public static void testStaticMethod(String s){
            System.out.println(Thread.currentThread().getName() + ":hello");
        if(i == 0){
            i = 1;
            try {
                //如果是第一个线程进来,让它休息1s
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
        //打印出这时候引用的s是否不受影响
        System.out.println(Thread.currentThread().getName() + s);
    }


    
        public static void main(String[] args) {
        // TODO Auto-generated method stub
        StaticMethodTest t0 = new StaticMethodTest();
        StaticMethodTest t1 = new StaticMethodTest();
        new Thread(t0,"t0").start();
        new Thread(t1,"t1").start();
    }

}

运行结果:

t1:hello
t0:hello
t00.3163063185891368
t10.861889330531942

结果分析:
这场t1线程先进入,然后等待1s
t0进入后不用等待马上打印出字符串
t1等待后打印出字符串,和t0的字符串不是同一个。

这说明不受影响

结论:
静态方法传入的参数是在多线程中是不会相互影响的,因为是引用传递,引用或者修改的只是当时传入的那个参数所指向的内存空间

上一篇下一篇

猜你喜欢

热点阅读