变量共享分析(Thread)
变量共享分析(Thread)
在编写多线程程序时,最重要的就是搞清楚哪些变量是共享的,哪些变量是不共享的。也就是要分析清楚其中的原理呀。
因为最近要使用多线程就看了一些,对使用 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.总结
总之,在多线程编程中,知道各个线程如何、怎么样共享数据是很重要的。
如上面的程序,可以在主线程和其他两个子线程之间共享一个对象,来实现他们之间的交互处理。
分类: java编程
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息