zoukankan      html  css  js  c++  java
  • 多线程与静态方法及其中的局部变量关系

    static 方法 方法在该方法所属类型第一次被使用的时候加载、在该类型所在应用程序域卸载的时候卸载、也就是说 static 方法只加载一次、除非整个Domain 被卸载了。而实例方法(非静态方法),是在第一次该方法第一次调用的时候会加载、然后被缓存起来。但是中间如果有GC 的话, 就会被收集,那下次再调用该方法时,又得重新加载该方法。也就是说,实例方法有可能加载多次。总的来说,static 方法只用加载一次,但一直会占用内存。多了些资源消耗;而实例方法需要加载多次,但不会一直占用内存。少些资源消耗。一般来说, 在程序里面,一些使用频率高的方法就用static 方法、使用频率低的则用实例方法。

    原文地址:http://blog.csdn.net/linchengzhi/article/details/7615266 

    我们在使用多线程中,最关心的是同步问题;在编程方面,为了方便,我们常常直接调用类的静态方法。一般认为静态是全局,是唯一的,在内存中只有一个拷贝,但是看看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

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    前端百度地图开发使用总结
    换电脑后如何同步git本地仓库及分支
    vue mint-ui初次使用总结
    git学习入门总结
    深夜,当音乐响起,数据在MySQL中静静的疯狂计算
    且说Tomcat、Servlet、JSP和Spring
    国庆与中秋7天死磕Web的时光
    Android编程初涉,以控制摄像头为例
    谈现阶段如何形成可行的健康生活习惯方案
    说Java网络编程
  • 原文地址:https://www.cnblogs.com/niaowo/p/4708888.html
Copyright © 2011-2022 走看看