多线程在运行时可能会出现三个案例:
- 同时取票时会,会出现负票数;
- 同时取款时,会出现负钱数;
- 将线程存入容器里时,可能会被覆盖
import java.util.ArrayList; import java.util.List; public class Unsafe { public static void main(String[] args) { List<String> list = new ArrayList<String>(); for (int i = 0; i < 10000; i++) { new Thread(()->{ list.add(Thread.currentThread().getName()); }).start(); } System.out.println(list.size()); } }
运行结果
8508
显然结果是错的,list的被覆盖了。
只要在锁定的地方加上synchronized(list){
}
import java.util.ArrayList; import java.util.List; public class Unsafe { public static void main(String[] args) throws InterruptedException { List<String> list = new ArrayList<String>(); for (int i = 0; i < 10000; i++) { new Thread(()->{ synchronized(list) { list.add(Thread.currentThread().getName()); } }).start(); } Thread.sleep(100);//防止没加完,就输出 System.out.println(list.size()); } }
运行结果
10000