static与并发

在java中static用来修饰Class类中属性方法

被static修饰的成员属性和成员方法独立于该类的任何对象,它们在内存空间上会被放在描述Class的位置中,也就是说它们为此类(Class)所有的实例对象共用。

所以说只要这个类被加载,那么这些被static修饰的属性和方法都已经在JVM中存在了,因此,我们可以通过类名直接调用这些属性和方法。

那么我就想到了一个在多线程和并发的情况下,被static修饰的方法会不会出现不正确的数据处理呢?

下面写一段测试的代码

Porter.java

public class Porter {
    public static void test(int num){
        System.out.printf("time : %s , num : %d \n",System.currentTimeMillis(),num);
    }
}

Runner.java

public class Runner implements Runnable{
    private int num;
    @Override
    public void run() {
        Porter.test(getNum());
    }
    public void setNum(int num){
        this.num = num;
    }
    public int getNum(){
        return this.num;
    }
    public static void main(String args[]){
        Thread th[] = new Thread[100];
        for (int i = 0; i < th.length; i++) {
            Runner run =new Runner();
            run.setNum(i);
            th[i] = new Thread(run);
            th[i].start();
        }

    }
}

在这个多线程程序中,run()方法一直都在调用Porter的一个static方法test()。实际程序输出如下:

time : 1423399741495 , num : 0  
time : 1423399741521 , num : 40  
time : 1423399741520 , num : 39  
time : 1423399741520 , num : 38  
time : 1423399741518 , num : 37  
time : 1423399741518 , num : 36  
time : 1423399741517 , num : 34  
time : 1423399741517 , num : 35  
time : 1423399741523 , num : 43  
time : 1423399741516 , num : 32  
time : 1423399741516 , num : 33  
time : 1423399741516 , num : 30  
time : 1423399741516 , num : 31  
time : 1423399741515 , num : 29  
time : 1423399741515 , num : 28
……

虽然省略了一部分,但是程序确实没有执行错误,通过系统的时间戳发现,中间有几个线程确实也是同时执行的。这样说来被static修饰的方法并不存在并发的问题,那么这是为什么呢?

其实这就是变量的问题了,每次静态方法每次调用的内部变量,都是局部变量,每次调用静态方法时都会为它重新分配内存空间,所以是安全的。

转载于:https://www.cnblogs.com/whthomas/p/4280498.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值