要想知道线程安全问题的原因及解决方案,首先得知道什么是线程安全,想给出一个线程安全的确切定义是复杂的,但我们可以这样认为:如果多线程环境下代码运行的结果是符合我们预期的,即在单线程环境应该的结果,则说这个程序是线程安全的。例如:使用两个线程分别对同一个变量进行修改,得出的结果与使用一个线程对这个变量进行修改的结果不同,这样的问题就可以说是该程序不是线程安全的。知道了什么是线程安全后,这样才好分析线程安全问题的原因及解决方案。
原因1)多个线程之间的调度顺序是随机的,操作系统使用抢占式策略来执行线程(根本原因),并且该原因无法改变,当前主流的操作系统都是如此:例如当两个线程分别对同时一个变量count++,则会使每次得到的结果不同,因为CPU的调度是抢占式的,且count++实际上有着三步操作,这就将导致得到的结果不同。因为count++的三步操作为:

public static volatile int count = 0;//倘若没有volatile,则该代码会一直进行下去 public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(() -> { while(count == 0){ ; } }); Thread t2 = new Thread(() -> { try { Thread.currentThread().sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } count = 1; }); t1.start(); t2.start(); t1.join(); }