首先什么是线程安全问题?
答:当多个线程同时修改做写操作的时候可能受到其他线程的干扰导致数据出现问题这种现象叫做线程安全问题
举个例子比如火车票自动售票机,原本有100张票分别有两个售票机进行判断票数是否大于0,如果票数大于0就把票出售给乘客,但当两个售票机同时读取这个变量的时候第一个判断大于0就售出了但第二个判断也大于0但前面第一个线程已经把票售出了所以此时是0张票这个时候就可能出现了-1张票,或者售出了同一张票
public class ThreadTest implements Runnable {
private int trainCount = 100;
@Override
public void run() {
while (trainCount > 0) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " Sell a ticket:" + (100-trainCount+1));
trainCount--;
}
}
public static void main(String[] args) {
ThreadTest threadTest = new ThreadTest();
Thread thread = new Thread(threadTest,"窗口①");
Thread thread2 = new Thread(threadTest,"窗口②");
thread.start();
thread2.start();
}
}
//运行结果
//窗口② Sell a ticket:93
//窗口① Sell a ticket:93
//窗口② Sell a ticket:95
//窗口① Sell a ticket:95
//窗口① Sell a ticket:97
//窗口② Sell a ticket:97
//窗口② Sell a ticket:99
//窗口① Sell a ticket:99
//窗口② Sell a ticket:101
可以看到上面售出了同一张票还售出了101张票 总结: 多线程同时对一个变量进行写操作并且需要是同一个全局变量就会导致线程安全问题