线程安全问题

多个线程操作同一个共享变量时,可能会造成数据不一致的情况,这个就是线程的安全问题。

代码演示:

    //当前数组下标值
    private static int INDEX = 0;

    public static void main(String[] args) throws InterruptedException {
        //定义一个长度为5的数组
        String[] arr = new String[5];
        //定义两个线程,分别往数组中插入不同的值。
        //这里我们期望可以得到["ONE","TWO",null.null,null]
        Thread t1 = new Thread(() -> {
            arr[INDEX] = "ONE";
            INDEX++;
        });

        Thread t2 = new Thread(() -> {
            arr[INDEX] = "TWO";
            INDEX++;
        });
        //启动线程
        t1.start();
        t2.start();
        //这里为了保证输出时这两个线程已经执行完毕,使用join方法来阻塞主线程
        t1.join();
        t2.join();

        //打印数组数据
        System.out.println(Arrays.toString(arr));
    }

输出结果:

[ONE, TWO, null, null, null]//运行1次
[ONE, TWO, null, null, null]//运行2次
[ONE, TWO, null, null, null]//运行3次
[TWO, null, null, null, null]//运行4次
...

运行第四次时我们发现结果出现了差异,这就是出现了线程安全问题。可能原因是t1在给INDEX=0赋值后,还没来得及INDEX++,t2就又对INDEX=0进行了操作,这时候就把INDEX=0处的数据进行了覆盖。

posted @ 2022-12-27 02:31  Amireux-126  阅读(9)  评论(0)    收藏  举报