写python程序的时候遇到了共享变量的问题,在网上看到了一篇讲java多线程变量共享的文章,有共通之处,整理下发在这里吧。
1.方法体内部定义的局部变量不共享。
这是因为方法内部定义的变量是在运行时动态生成的。每个线程都有一个自己的堆栈,用于保存运行时的数据。 最容易理解的就是递归调用时候,每次的入栈出栈操作。如下,每次调用时,变量a都是在运行时堆栈上保存的,方法结束变量也就释放了。
public int fib(int n)
{
int a;
if(n==1 || n==0)
return 1;
else
return fib(n-1)*n;
}
2.成员变量需要看变量指向的是否为同一个对象。
看下面的代码示例:
public class Analy {
public static void main(String[] args) {
Num i=new Num(0); //新建对象,准备传递给线程,对于对象java采用引用传递,因此线程间相当于共享该变量
OwnThread t1=new OwnThread(i);
OwnThread t2=new OwnThread(i); //新建线程,并启动
t1.start();
t2.start();
t1.join();
t2.join();
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;
}
}
运行结果:
Thread-1,1
Thread-0,0
Thread-1,2
Thread-0,3
Thread-1,4
Thread-0,5
Thread-0,7
Thread-1,6
Thread-0,8
Thread-1,9
主线程中i的值变为了:10
分析:
程序中主函数定义了Num对象的实例i,传递到了Thread0和Thread1。这样线程间就共享了一个Num对象的实例。而线程Thread0和线程Thread1又有自己的私有变量sno,可以用来保存某一时刻的共享变量的数值。
Java中判断对象是否为同一个对象使用地址判断的。地址相同就是同一个对象,上面的三个就是同一个对象。
如果把上面的例子*享的对象实例用基本数据类型替换是不行的。因为基本数据类型程序会自动的用默认值初始化,也就是申明和定义时一起的。此时在mian函数中定义线程,传递的基本数据类型参数,只能是初始化线程中的另一个对象,而不是同一个对象。
总结:
总之,在多线程编程中,知道各个线程如何、怎么样共享数据是很重要的。
如上面的程序,可以在主线程和其他两个子线程之间共享一个对象,来实现他们之间的交互处理。