博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java多线程编程:变量共享分析(Thread)
阅读量:6293 次
发布时间:2019-06-22

本文共 1729 字,大约阅读时间需要 5 分钟。

在编写多线程程序时,最重要的就是搞清楚哪些变量是共享的,哪些变量是不共享的。也就是要分析清楚其中的原理呀。

因为最近要使用多线程就看了一些,对使用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.总结

  总之,在多线程编程中,知道各个线程如何、怎么样共享数据是很重要的。

  如上面的程序,可以在主线程和其他两个子线程之间共享一个对象,来实现他们之间的交互处理。

转载地址:http://cvdta.baihongyu.com/

你可能感兴趣的文章
小程序 · 跳转带参数写法,兼容url的出错
查看>>
flutter error
查看>>
Flask框架从入门到精通之模型数据库配置(十一)
查看>>
10年重新出发
查看>>
2019年-年终总结
查看>>
聊聊elasticsearch的RoutingService
查看>>
让人抓头的Java并发(一) 轻松认识多线程
查看>>
从源码剖析useState的执行过程
查看>>
地包天如何矫正?
查看>>
中间件
查看>>
Android SharedPreferences
查看>>
css面试题
查看>>
Vue组建通信
查看>>
用CSS画一个带阴影的三角形
查看>>
前端Vue:函数式组件
查看>>
程鑫峰:1.26特朗.普力挺美元力挽狂澜,伦敦金行情分析
查看>>
safari下video标签无法播放视频的问题
查看>>
01 iOS中UISearchBar 如何更改背景颜色,如何去掉两条黑线
查看>>
对象的继承及对象相关内容探究
查看>>
Spring: IOC容器的实现
查看>>