先看一个程序例子:

  

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 多线程(四) 多线程访问成员变量与局部变量的更多相关文章

  1. iava多线程详解(2)-成员变量与局部变量访问

    有两段代码 1.线程访问成员变量 public class FirstThreadTest { public static void main(String[] args) { FirstThread ...

  2. java类与对象_成员变量和局部变量区别

    成员变量和局部变量:1.成员变量:再类中定义,用来描述对象将要有什么.2.局部变量:在类的方法中定义,在方法中临时保存数据.区别:1.作用域不同:  局部:仅限于定义它的方法  成员:整个类中都是可见 ...

  3. 【转】Java 多线程(四) 多线程访问成员变量与局部变量

    原文网址:http://www.cnblogs.com/mengdd/archive/2013/02/16/2913659.html 先看一个程序例子: public class HelloThrea ...

  4. Java 访问限制符 在同一包中或在不同包中:使用类创建对象的权限 & 对象访问成员变量与方法的权限 & 继承的权限 & 深入理解protected权限

    一.实例成员与类成员 1. 当类的字节码被加载到内存, 类中类变量.类方法即被分配了相应内存空间.入口地址(所有对象共享). 2. 当该类创建对象后,类中实例变量被分配内存(不同对象的实例变量互不相同 ...

  5. Java反射理解(四)-- 获取成员变量构造函数信息

    Java反射理解(四)-- 获取成员变量构造函数信息 步骤 获取成员变量信息: obj.getClass() 获取类类型对象 成员变量也是对象,java.lang.reflect.Field 类中封装 ...

  6. JAVA类与对象(四)----成员变量与局部变量 、成员方法、构造方法

    类体中的变量分为两部分.变量定义部分定义的变量为类的成员变量,在方法体中定义的变量和方法中涉及的变量称为局部变量. 成员变量和局部变量的区别: (1).成员变量在整个类中都有效,局部变量只在定义它的方 ...

  7. java 继承访问成员变量

    package java09; //创建父类 public class Fu { int numFu = 10; int num =100; public void methodFu(){ Syste ...

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

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

  9. 【java基础】成员变量和局部变量

    成员变量和局部变量 根据定义变量位置的不同,可以将变量分为成员变量和局部变量        成员变量是在类范围内定义的变量        局部变量是在一个方法内定义的变量   成员变量可以分为:   ...

随机推荐

  1. 一步一步学MySQL-一致性非锁定读和锁定读

    一致性非锁定读(consistent nonlocking read) 一致性非锁定读是值InnoDB存储引擎通过多版本控制(multi versioning)的方式来读取当前执行时间数据库中的数据. ...

  2. 第一个简单的python程序,模拟购物车

    第一个pyhone程序,简单的购物车功能,刚开始学习,练习下手感. #/usr/bin/env python#-*- coding:utf-8 -*- salary = int(raw_input(& ...

  3. angular学习(二)-- Directive

    1.2 指令:Directive AngularJS 通过被称为 指令 的新属性来扩展 HTML, 具体表现形式一般为带有前缀 ng-xxx 的 HTML 属性. 指令的使用形式 ng-xxx 的属性 ...

  4. python实战===实现读取txt每一行的操作,账号密码

    最近搞到了一批163邮箱的账号和密码,但是里面有部分账号不能用,密码是错的. 以此为背景 人工手动挨个登录检查效率太低! 于是写了下面这个脚本: import linecache import smt ...

  5. NOIP2000提高组 单词接龙

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙" ...

  6. vTPM环境部署(ubuntu)

    注:1.系统:ubuntu16.04LTS2.ISO镜像:/home/huanghaoxiang/ubuntu-server.iso3.IMG路径:/home/TPM-Machine4.Login: ...

  7. 朱世杰恒等式的应用-以CF841C为例

    题目大意 Codeforces 841C Leha and Function. 令\(F(n,k)\)为在集合\(\{x|x \in [1,n]\}\)中选择一个大小为k的子集,最小元素的期望值. 给 ...

  8. Qt支持中文显示

    Qt支持中文显示<1>.在代码中添加以下代码 QTextCodec* codec = QTextCodec::codecForLocale(); if (codec != NULL) { ...

  9. 设计模式之Adapter模式

    说起Adapter,STL里的stack和queue都是adapter,底层是deque,隐藏了deque的一些接口,使得其可以达到FIFO是queue,LIFO是stack. The STL sta ...

  10. HTML-JS基础 变量与输入输出 运算符 分支结构

    js中的变量 1.JS中变量声明的写法: var num=10;//使用var声明的变量属于局部变量只在当前作用域内有效 num=10;//不用var声明的变量,默认为全局变量,在整个JS文件中都有效 ...