西西软件园多重安全检测下载网站、值得信赖的软件下载站!
软件
软件
文章
搜索

首页编程开发java → Java多线程变量共享分析(Thread)

Java多线程变量共享分析(Thread)

前往专题相关软件相关文章发表评论 来源:西西整理时间:2013/5/22 21:24:05字体大小:A-A+

作者:西西点击:145次评论:0次标签: 多线程

  • 类型:服务器区大小:21KB语言:中文 评分:6.6
  • 标签:
立即下载

多线程对共享变量的访问,通过琐保证互斥访问。本章主要讨论如何在多线程间共享对象,保证其被安全访问。在编写多线程程序时,最重要的就是搞清楚哪些变量是共享的,哪些变量是不共享的。也就是要分析清楚其中的原理呀。

实现线程安全的方法之一是不在线程间共享变量,将变量的使用范围限制在单个线程之内,即实现Thread Confinement。

因为最近要使用多线程就看了一些,对使用Thread类的子类创建线程的情况,总结如下:

1.方法体内部定义的局部变量不共享

这是因为方法内部定义的变量是在运行时动态生成的。每个线程都有一个自己的堆栈,用于保存运行时的数据。

最容易理解的就是递归调用时候,每次的入栈出栈操作。如下,每次调用时,变量aa都是在运行时堆栈上保存的,方法结束变量也就释放了。

public int fib(int n)
{
    int aa;
    if(n==1 || n==0)
        return 1;
    else
        return fib(n-1)*n;
}

2.成员变量

2.1 代码示例

成员变量需要看变量指向的是否为同一个对象。看下面的代码示例:

package file2;
public class Analy {
    public static void main(String[] args) {
        Num i=new Num(0);    //新建对象,准备传递给线程
        new OwnThread(i).start();    //新建线程,并启动
        new OwnThread(i).start();    //新建线程,并启动
        System.out.println("主线程中i的值变为了:"+i.i);    //获取目前对象i的数值
    }
}

class OwnThread extends Thread
{
    Num id;    //申明对象,默认null,就是没有指向任何实体
    int sno;    //申明int变量。因为系统默认初始化为0,所以应该是定义一个int变量
    OwnThread(Num id)
    {
        this.id=id;
    }
    
    public void run()
    { 
        for(int i=0;i<5;i++)
        {
            synchronized(this)
            {
                sno=id.i;    //保存id.i的数值,到线程私有变量sno
                id.i++;
                try {
                    Thread.sleep(1);
                } 
                catch (InterruptedException e) {}
            }
            System.out.println(this.getName()+","+sno);
        }
    }
}

class Num    //定义一个类
{
    int i;
    Num(int i)
    {
        this.i=i;
    }
}

共享同一个对象,线程可以交互,执行结果:

 

2.2分析

程序中主函数定义了Num对象的实例i,定义线程是传递到了Thread0和Thread1这样三个变量就共享了一个Num对象的实例。而线程Thread0和线程Thread1又有自己的私有变量sno,可以用来保存某一时刻的共享变量的数值。

注意:
(1)Java中判断对象是否为同一个对象使用地址判断的。地址相同就是同一个对象,上面的三个就是同一个对象。

 (2)如果把上面的例子中共享的对象实例用基本数据类型替换是不行的。因为基本数据类型程序会自动的用默认值初始化,也就是申明和定义时一起的。此时在mian函数中定义线程,传递的基本数据类型参数,只能是初始化线程中的另一个对象,而不是同一个对象。

3.总结

总之,在多线程编程中,知道各个线程如何、怎么样共享数据是很重要的。如上面的程序,可以在主线程和其他两个子线程之间共享一个对象,来实现他们之间的交互处理。

    相关评论

    阅读本文后您有什么感想? 已有人给出评价!

    • 8 喜欢喜欢
    • 3 顶
    • 1 难过难过
    • 5 囧
    • 3 围观围观
    • 2 无聊无聊

    热门评论

    最新评论

    发表评论 查看所有评论(0)

    昵称:
    表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲
    字数: 0/500 (您的评论需要经过审核才能显示)