博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】Java 多线程(四) 多线程访问成员变量与局部变量
阅读量:4565 次
发布时间:2019-06-08

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

原文网址:http://www.cnblogs.com/mengdd/archive/2013/02/16/2913659.html

先看一个程序例子:

  

public class HelloThreadTest{    public static void main(String[] args)    {        HelloThread r = new HelloThread();        Thread t1 = new Thread(r);        Thread t2 = new Thread(r);        t1.start();        t2.start();    }}class HelloThread implements Runnable{    int i;    @Override    public void run()    {        while (true)        {            System.out.println("Hello number: " + i++);            try            {                Thread.sleep((long) Math.random() * 1000);            }            catch (InterruptedException e)            {                e.printStackTrace();            }            if (50 == i)            {                break;            }        }    }}

  该例子中,HelloThread类实现了Runnable接口,其中run()方法的主要工作是输出"Hello number: "字符串加数字i,并且同时递增i,当i到达50时,退出循环。

  main()方法中生成了一个HelloThread类的对象r,并且利用这个一个对象生成了两个线程。

  程序的执行结果是:顺次打印了0到49的数字,共50个数字。

  这是因为,i是成员变量,则HelloThread的对象r只包含这一个i,两个Thread对象因为由r构造,所以共享了同一个i

  当我们改变代码如下时(原先的成员变量i被注释掉,增加了方法中的局部变量i):

public class HelloThreadTest{    public static void main(String[] args)    {        HelloThread r = new HelloThread();        Thread t1 = new Thread(r);        Thread t2 = new Thread(r);        t1.start();        t2.start();    }}class HelloThread implements Runnable{    // int i;    // 若i是成员变量,则HelloThread的对象r只包含这一个i,两个Thread对象因为由r构造,所以共享了同一个i    // 打印结果是0到49的数字    @Override    public void run()    {        int i = 0;        // 每一个线程都会拥有自己的一份局部变量的拷贝        // 线程之间互不影响        // 所以会打印100个数字,0到49每个数字都是两遍        while (true)        {            System.out.println("Hello number: " + i++);            try            {                Thread.sleep((long) Math.random() * 1000);            }            catch (InterruptedException e)            {                e.printStackTrace();            }            if (50 == i)            {                break;            }        }    }}

  如注释中所述,由于局部变量对于每一个线程来说都有自己的拷贝,所以各个线程之间不再共享同一个变量,输出结果为100个数字,实际上是两组,每组都是0到49的50个数字,并且两组数字之间随意地穿插在一起。 

 

得到的结论如下:

  如果一个变量是成员变量,那么多个线程对同一个对象的成员变量进行操作时,它们对该成员变量是彼此影响的,也就是说一个线程对成员变量的改变会影响到另一个线程。

  如果一个变量是局部变量,那么每个线程都会有一个该局部变量的拷贝(即便是同一个对象中的方法的局部变量,也会对每一个线程有一个拷贝),一个线程对该局部变量的改变不会影响到其他线程。

 

 

参考资料

  圣思园张龙老师Java SE系列视频教程。

转载于:https://www.cnblogs.com/wi100sh/p/4495739.html

你可能感兴趣的文章
synchronized无法禁止指令重排序的证明
查看>>
第三周学习进度
查看>>
Mysql命令行执行脚本
查看>>
机器学习中使用的神经网络(四)
查看>>
性能测试(并发负载压力)测试分析-Loadrunner
查看>>
数组的常见操作
查看>>
什么是HashCode ,其作用是什么?
查看>>
窗体控件的验证
查看>>
JVM内存管理简单剖析
查看>>
bind函数原理
查看>>
webpack笔记(1) 基本配置
查看>>
HTML-代码定义
查看>>
requests 模块笔记
查看>>
POJ 1061 青蛙的约会【扩欧】
查看>>
HDU 5640 King's Cake【模拟】
查看>>
npm 传入参数
查看>>
react 页面存在多 input 时
查看>>
javascript 冒泡排序
查看>>
Oracle正确删除archivelog文件(转)
查看>>
Java入门(2) —— 变量详解、运算符、定义类和定义方法以及方法的调用
查看>>