JAVA多线程修改公共变量引发的血案

概述

多线程并发修改同公共变量时,可能会出现bug

案例

在售票时,一般是多个售票窗口,但卖出的票号是唯一的

通过编写多线程模拟这一过程

定义线程,模拟售票

public class RunnableImpl implements Runnable {
    public final int COUNT=100;
    private int ticket=1;
    @Override
    public void run() {
        while(ticket<=COUNT){
            System.out.println(Thread.currentThread().getName()+"-售出票号:"+ticket);
            ticket++;
            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

定义测试类,创建多个窗口开始售票

public class Main {
    public static void main(String[] args) {
        RunnableImpl ri=new RunnableImpl();
        Thread t1=new Thread(ri,"窗口1");
        Thread t2=new Thread(ri,"窗口2");

        t1.start();
        t2.start();
    }
}

执行结果:

窗口2-售出票号:1
窗口1-售出票号:1
窗口2-售出票号:2
窗口1-售出票号:2
窗口1-售出票号:3
窗口2-售出票号:3
。。。。。。。。

会发现不同的窗口,售出的票号是相同的

错误原因

执行顺序如下:

第一步,线程1获取num的值495
第二步,线程2获取num的值495
第三步,线程1计算后将496写入num
第四步,线程2计算后将496写入num

结论

多线程修改公共变量时,一个线程只执行一部分,还没执行完,另一个线程参与进来执行,导致公共变量错误


原文出处:/show_1EF4swj80JMR.html