多线程-局部变量和成员变量

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,所以会造成对成员变量的操作会造成另外一个线程的影响

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值