什么是线程安全和线程不安全

百度百科的解释是:线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。

简单通俗的解释就是:多个线程在并行执行且使用到了共享数据的操作中,最终能正确执行得到正确结果的就是线程安全的,反之就是线程不安全的。

当线程存在全局变量、静态变量,且线程对这些变量存在写操作时,大概率会导致线程不安全的现象出现。

下面是一个线程不安全的小例子:main方法创建times个CountThread线程并启动他,CountThread线程的处理逻辑就是使用count变量统计run()方法执行次数

public class Test {

    public static void main(String[] args) {
        for (int i = 0; i < CountThread.times; i++) {
            new CountThread().start();
        }
        try {
            CountThread.latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("CountThread.times=" + CountThread.times);
        System.out.println("CountThread.count=" + CountThread.count);
        System.out.println("是否相等" + (CountThread.count == CountThread.times));
    }

}

class CountThread extends Thread {

    public static int times = 100;

    public static final CountDownLatch latch = new CountDownLatch(times);

    public static int count = 0;

    @Override
    public void run() {
        //模拟业务操作耗时
        try {
            Thread.sleep((long) (Math.random() * 10));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //调用次数+1
        count++;
        //latch-1
        latch.countDown();
    }

}

我们预期的结果应该是CountThread.count == times,但实际的执行结果却是:

CountThread.times=100
CountThread.count=95
是否相等false

这就是产生了线程不安全的情况,因为count++并不是原子操作。


觉得内容还不错?打赏个钢镚鼓励鼓励!!👍