验证线程之间会出现相互干扰的情况时,不可用普通变量代替成员变量的原因

需求

创建5个线程,需在线程的run()中设置"存储数据"、“获取/输出数据”,观察某些线程会不会获取到其他线程的数据

一、普通变量(不可行)

1、原因

​(1) 通过for循环,会给每个线程1个threadData
​(2) 而每个线程的threadData的作用域仅限于run()中
​(3) 由于自定义普通变量的作用域局限性,并不能通过threadData体现线程之间的相互干扰
​(4) 即由于变量的作用域,线程A不能获取到线程B的数据

2、MainThread
public class MainThread {
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            String threadData = null;
            new Thread(new Runnable() {
                @Override
                public void run() {
                    threadData = Thread.currentThread().getName() + "'s Data";
                    System.out.println(Thread.currentThread().getName() + ": " + threadData);
                }
            }).start();
        }
    }
}
//Console:
Thread-0: Thread-0's Data
Thread-1: Thread-1's Data
Thread-2: Thread-2's Data
Thread-3: Thread-3's Data
Thread-4: Thread-4's Data

二、成员变量(可行)

1、原因

(1) 通过在其他类new一个threadData所在类的对象,使得threadData的Set、Get可在其他类中使用,实现threadData跨域的存储数据、获取数据
(2) 由于是类中方法,有对象就可调用,不像普通变量一样会受到局部作用域的影响,可理解为"自由作用域"
​(3) 因此各线程都可能获取到其他线程的数据
​(4) 在实际应用中,线程中使用的数据一般来自线程外,不像自定义普通变量一样在线程的run()中自产自销,因此成员变量 + Set、Get更合适

2、DataMedia
public class DataMedia {
    private String threadData;
    public String getThreadData() {
        return threadData;
    }
    public void setThreadData(String threadData) {
        this.threadData = threadData;
    }
}
3、MainThread
public class MainThread {
    public static void main(String[] args) {
        DataMedia dm = new DataMedia();
        for (int i = 0; i < 5; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    dm.setThreadData(Thread.currentThread().getName() + "'s Data");
                    System.out.println(Thread.currentThread().getName() + ": " + dm.getThreadData());
                }
            }).start();
        }
    }
}
//Console:
Thread-4: Thread-4's Data
Thread-3: Thread-3's Data
Thread-0: Thread-0's Data
Thread-1: Thread-1's Data
Thread-2: Thread-0's Data
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值