概述
多线程并发修改同公共变量时,可能会出现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
结论
多线程修改公共变量时,一个线程只执行一部分,还没执行完,另一个线程参与进来执行,导致公共变量错误
