多线程与静态方法及其中的局部变量关系

我们在使用多线程中,最关心的是同步问题;在编程方面,为了方便,我们常常直接调用类的静态方法。一般认为静态是全局,是唯一的,在内存中只有一个拷贝,但是看看thinking in java 里面的关于static 的描述:
一种情形是只想用一个存储区域来保存一个特定的数据——无论要创建多少个对象,甚至根本不创建对象。另一种情形是我们需要一个特殊的方法,它没有与这个类的任何对象关联。也就是说,即使没有创建对象,也需要一个能调用的方法。为满足这两方面的要求,可使用static(静态)关键字。引用:http://wenda.tianya.cn/wenda/thread?tid=2f184c45a0b790a6

通过上面的描述,我们可以知道静态方法,其最主要目的是为了不需要实例化,在多线程中,每个线程会各自拥有一份静态方法的拷贝,不存在同步问题。当然,如果数据存在竞争,那就要使用同步了,比如,静态方法中有插入数据到数据库的操作,这个操作就存在竞争,我们可以使用事务来进行同步。

下面是一个测试实例:

代码:

package test;


public class Test {

    public static void main(String[] args) {

        new Thread(new Runnable() {
            public void run() {
                localVariableInStaticMethod(1);
            }
        }).start();

        new Thread(new Runnable() {
            public void run() {
                localVariableInStaticMethod(2);
            }
        }).start();

        new Thread(new Runnable() {
            public void run() {
                localVariableInStaticMethod(3);
            }
        }).start();

        new Thread(new Runnable() {
            public void run() {
                localVariableInStaticMethod(4);
            }
        }).start();

        new Thread(new Runnable() {
            public void run() {
                localVariableInStaticMethod(5);
            }
        }).start();

        new Thread(new Runnable() {
            public void run() {
                localVariableInStaticMethod(6);
            }
        }).start();

        new Thread(new Runnable() {
            public void run() {
                localVariableInStaticMethod(7);
            }
        }).start();

        new Thread(new Runnable() {
            public void run() {
                localVariableInStaticMethod(8);
            }
        }).start();

        new Thread(new Runnable() {
            public void run() {
                localVariableInStaticMethod(9);
            }
        }).start();

    }

    static public void localVariableInStaticMethod(int number) {
        int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        int[] a = new int[9];
        for (int i = 0; i < a.length; i++) {
            a[i] = array[i];
            System.out.println(number + "-" + a[i]);
        }
    }

}

结果:

...

9-1
9-2
9-3
9-4
9-5
9-6

8-1
8-2
8-3
9-7
8-4
9-8
8-5
9-9
8-6
8-7
8-8
8-9

从结果我们可以确定每个线程会各自拥有一份静态方法的拷贝。

粗浅理解,还望同学们指正。

欢迎阅读相关文章: http://hi.csdn.net/linchengzhi

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值