线程安全问题
多个线程操作同一个共享变量时,可能会造成数据不一致的情况,这个就是线程的安全问题。
代码演示:
//当前数组下标值 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处的数据进行了覆盖。

浙公网安备 33010602011771号