java 多线程 成员变量_Java 多线程(四) 多线程访问成员变量与局部变量

Java 多线程(四) 多线程访问成员变量与局部变量

先看一个程序例子:

public classHelloThreadTest

{public static voidmain(String[] args)

{

HelloThread r= newHelloThread();

Thread t1= newThread(r);

Thread t2= newThread(r);

t1.start();

t2.start();

}

}class HelloThread implementsRunnable

{inti;

@Overridepublic voidrun()

{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 classHelloThreadTest

{public static voidmain(String[] args)

{

HelloThread r= newHelloThread();

Thread t1= newThread(r);

Thread t2= newThread(r);

t1.start();

t2.start();

}

}class HelloThread implementsRunnable

{//int i;//若i是成员变量,则HelloThread的对象r只包含这一个i,两个Thread对象因为由r构造,所以共享了同一个i//打印结果是0到49的数字

@Overridepublic voidrun()

{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系列视频教程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值