Java多线程对成员变量和局部变量的影响
最近复习了一下Java多线程的一些基础的础知识,这里演示一个java多线程对成员变量和局部变量的Demo
对局部变量的操作:
/**
* Java局部变量和成员变量代码演示
*/
public class TTTTTT {
public static void main(String[] args)
{
DemoThread r = new DemoThread ();
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
t1.start();
t2.start();
//可以看到控制打印了20次
}
}
class DemoThread implements Runnable {
int i;//这里成员变量,
@Override
public void run() {
while (true) {
System.out.println("测试打印次数: " + i++);
try {
Thread.sleep((long) Math.random() * 10000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
if (20 == i) {
break;
}
}
}
}
打印结果:
测试打印次数: 0
测试打印次数: 2
测试打印次数: 1
测试打印次数: 3
测试打印次数: 4
测试打印次数: 5
测试打印次数: 6
测试打印次数: 7
测试打印次数: 8
测试打印次数: 9
测试打印次数: 10
测试打印次数: 11
测试打印次数: 12
测试打印次数: 13
测试打印次数: 14
测试打印次数: 15
测试打印次数: 16
测试打印次数: 17
测试打印次数: 18
测试打印次数: 19
1.上面例子中:DemoThread实现了Runable接口类实现了Runnable接口,其中run()方法的主要工作是输出”测试打印次数”字符串加数字i,并且同时递增i,当i到达20时,退出循环。
2.main()方法中生成了一个DemoThread类的对象r,并且利用这个一个对象生成了两个线程。
3.因为i是我们的局部变量,而且两个Thread对象都是有r构造,共享了一个i。所以一共打印了20次数
对局部变量的操作:
对上面的例子进行修改,代码如下:
/**
* Java局部变量和成员变量代码演示
*/
public class TTTTTT {
public static void main(String[] args)
{
DemoThread r = new DemoThread ();
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
t1.start();
t2.start();
//可以看到控制打印了20次
}
}
class DemoThread implements Runnable {
// int i;//这里成员变量,两个Thread共享了一个r,所以这里共享了一个i,打印次数一共20次数
@Override
public void run() {
int i=0;//这里的i为局部变量,每个线程自己都有一个i,所以这里不会共享,打印的次数为40次
while (true) {
System.out.println("测试打印次数: " + i++);
try {
Thread.sleep((long) Math.random() * 10000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
if (20 == i) {
break;
}
}
}
}
打印结果:
测试打印次数: 0
测试打印次数: 1
测试打印次数: 2
测试打印次数: 3
测试打印次数: 4
测试打印次数: 5
测试打印次数: 6
测试打印次数: 7
测试打印次数: 8
测试打印次数: 9
测试打印次数: 10
测试打印次数: 11
测试打印次数: 12
测试打印次数: 13
测试打印次数: 0
测试打印次数: 1
测试打印次数: 2
测试打印次数: 3
测试打印次数: 4
测试打印次数: 5
测试打印次数: 6
测试打印次数: 7
测试打印次数: 8
测试打印次数: 9
测试打印次数: 10
测试打印次数: 11
测试打印次数: 12
测试打印次数: 13
测试打印次数: 14
测试打印次数: 15
测试打印次数: 16
测试打印次数: 17
测试打印次数: 18
测试打印次数: 19
测试打印次数: 14
测试打印次数: 15
测试打印次数: 16
测试打印次数: 17
测试打印次数: 18
测试打印次数: 19
可以看到打印的结果为40次数。
结论:
如果一个变量是成员变量,那么多个线程对同一个对象的成员变量进行操作时,它们对该成员变量是彼此影响的,也就是说一个线程对成员变量的改变会影响到另一个线程。
如果一个变量是局部变量,那么每个线程都会有一个该局部变量的拷贝(即便是同一个对象中的方法的局部变量,也会对每一个线程有一个拷贝),一个线程对该局部变量的改变不会影响到其他线程。
注意
一定是多个线程对同一个对象的成员变量进行操作。也就是多个线程共享了一个对象。这个是前提条件。上面例子中t1和t2共享了同一个r,所以会造成对成员变量的操作会造成另外一个线程的影响