有两段代码

1.线程访问成员变量

  1. public class FirstThreadTest
  2. {
  3. public static void main(String[] args)
  4. {
  5. FirstThread r = new FirstThread();
  6.  
  7. Thread t1 = new Thread(r);
  8. Thread t2 = new Thread(r);
  9.  
  10. t1.start();
  11. t2.start();
  12.  
  13. }
  14. }

  15. /**
    * 第一个线程程序
    */
  16. class FirstThread implements Runnable
  17. {
  18. int i;
  19.  
  20. @Override
  21. public void run()
  22. {
  23.  
  24. while (true)
  25. {
  26. System.out.println("number of: " + i++);
  27.  
  28. try
  29. {
  30. Thread.sleep((long) Math.random() * );
  31. }
  32. catch (InterruptedException e)
  33. {
  34. e.printStackTrace();
  35. }
  36.  
  37. if ( == i)
  38. {
  39. break;
  40. }
  41. }
  42.  
  43. }
  44. }

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

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

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

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

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

2.线程访问局部变量

  1. public class FirstThreadTest
  2. {
  1. public static void main(String[] args)
  2. {
  3. HelloThread r = new HelloThread();
  4.  
  5. Thread t1 = new Thread(r);
  6. Thread t2 = new Thread(r);
  7.  
  8. t1.start();
  9. t2.start();
  10.  
  11. }
  12.  
  13. }

/**
 * 通过Runnable接口实现线程
 */

class FirstThread implements Runnable

  1. {
  2. // int i;
  3. // 若i是成员变量,则FirstThread共享了同一个i
  4. // 打印结果是0到49的数字
  5. @Override
  6. public void run()
  7. {
  8. int i = 0;
  9. // 每一个线程都会拥有自己的一份局部变量的拷贝
  10. // 线程之间互不影响
  11. // 所以会打印100个数字,0到49每个数字都是两遍
  12. while (true)
  13. {
  14. System.out.println("Hello number: " + i++);
  15.  
  16. try
  17. {
  18. Thread.sleep((long) Math.random() * 1000);
  19. }
  20. catch (InterruptedException e)
  21. {
  22. e.printStackTrace();
  23. }
  24.  
  25. if (50 == i)
  26. {
  27. break;
  28. }
  29. }
  30.  
  31. }
  1. }

结论:

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

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

iava多线程详解(2)-成员变量与局部变量访问的更多相关文章

  1. java中多线程详解-synchronized

    一.介绍 当多个线程涉及到共享数据的时候,就会设计到线程安全的问题.非线程安全其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是“脏读”.发生脏读,就是取到的数据已经被其他的线 ...

  2. java多线程详解(3)-线程的互斥与同步

    前言:前一篇文章主要描述了多线程中访成员变量与局部变量问题,我们知道访成员变量有线程安全问题,在多线程程序中 我们可以通过使用synchronized关键字完成线程的同步,能够解决部分线程安全问题 在 ...

  3. iOS开发——多线程OC篇&多线程详解

    多线程详解 前面介绍了多线程的各种方式及其使用,这里补一点关于多线程的概念及相关技巧与使用,相信前面不懂的地方看了这里之后你就对多线程基本上没有什么问题了! 1——首先ios开发多线程中必须了解的概念 ...

  4. iOS开发——GCD多线程详解

    GCD多线程详解 1. 什么是GCD Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,简单来说,GCD就是iOS一套解决多线程的机制,使用GCD能够最大限度简化多线程 ...

  5. Java 多线程详解(四)------生产者和消费者

    Java 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html Java 多线程详解(二)------如何创建进程和线程: ...

  6. Java温故而知新(2)多线程详解

    多线程指的是在单个程序中可以同时运行多个同的线程执行不同的任务.线程是程序内的顺序控制流,只能使用分配给序的资源和环境.     一.线程与进程的区别 多个进程的内部数据和状态都是完全独立的,而多线程 ...

  7. python多线程详解

    目录 python多线程详解 一.线程介绍 什么是线程 为什么要使用多线程 二.线程实现 threading模块 自定义线程 守护线程 主线程等待子线程结束 多线程共享全局变量 互斥锁 递归锁 信号量 ...

  8. C#多线程详解(一) Thread.Join()的详解

    bicabo   C#多线程详解(一) Thread.Join()的详解 什么是进程?当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程 ...

  9. java 线程---成员变量与局部变量

    关于成员变量与局部变量: 如果一个变量是成员变量,那么多个线程对同一个对象的成员变量进行操作时,他们对该成员变量是彼此影响的(也就是说一个线程对成员变量的改变会影响到另一个线程) . 如果一个变量是局 ...

随机推荐

  1. 基于mini2440的Qt移植

    花了很长时间,终于把Qt移植到mini2440开发板上了,不能说完全成功,总算是完成一大步,各中过程心酸,废话不多说,下面正式讲解移植过程. 移植环境: win7系统,虚拟机是ubuntu12.04 ...

  2. 答:SQLServer DBA 三十问之六:Job信息我们可以通过哪些表获取;系统正在运行的语句可以通过哪些视图获取;如何获取某个T-SQL语句的IO、Time等信息;

    6. Job信息我们可以通过哪些表获取:系统正在运行的语句可以通过哪些视图获取:如何获取某个T-SQL语句的IO.Time等信息: 我的MSDB数据库中有全部的表: sys.all_columns,s ...

  3. ZYNQ 的PS GEM DMA存在缺陷

    使用iperf对zynq进行单socket tcp传输速率测试: 无网络损伤时,单向网络带宽约为600Mbps,双向网络带宽相加约400Mbps: 50ms延时,1ms抖动,无丢包时,单向网络带宽约为 ...

  4. const关键字也许该被替换为readonly

    只读的变量,其值在编译时不能被使用,因为编译器在编译时不知道其存储的内容. const修饰的只读变量 const  int   Max = 100: int  Array[Max] ; c文件中,编译 ...

  5. 从不同方面寻找bug

    从小学生的角度,为了熟能生巧,更好掌握知识,那就需要不断的练习,然而app没有重新开始的功能,要退出再重新进入,很麻烦.还有,如果小学生只想做一类的计算,例如,只想做减法或乘法,那么它就不能满足. 我 ...

  6. Foundation框架—日期类(NSDate)

    一 时间类NSDate .创建一个日期对象     NSDate *date1 = [[NSDate alloc] init]; //创建了一个当前的时间点     NSDate *date2 = [ ...

  7. Centos下安装Mongodb

    转自:http://nnzhp.cn/article/10/ Mongodb是一种nosql类型的数据库,高性能.易部署.易使用的特点在IT行业非常流行. 下面介绍一下mongodb的安装方式,这里我 ...

  8. canvas知识点

    看到网上某些特别好看的效果,就突然想看看这个canvas; canvas是html5中的一个标签.所以兼容的是Internet Explorer 9.Firefox.Opera.Chrome 和 Sa ...

  9. Host基本概念

    TSO            TSO是Time Sharing Option的缩写,是MVS的命令输入处理器.        TSO是在操作系统的管理下,用来支持ISPF菜单式会话系统和资源管理设备( ...

  10. git命令解析

    一 常用命令 1..gitignore 文件为git忽略文件,例*.[oa] *.~ 为忽略.a或.o或.~结尾的文件./表示忽略目录,!表示反取, *表示匹配零个或者多个字符.?表示匹配一个字符. ...