并发下的ArrayList
1 | public class ArrayListMultiThreadTest { |
运行这段代码,期望各添加1000 000个元素,但是遇到两种非预期结果:
- 程序抛出异常 Exception in thread “Thread-0” java.lang.ArrayIndexOutOfBoundsException: 823
- ArrayList大小为1000141
改进方式:ArrayList换为Vector
并发下的HashMap
1 | public class HashMapMultiThreadTest { |
运行这段代码,期望各添加10000个元素,但是遇到两种非预期结果:
- 程序陷入死循环。在JDK 8以后规避了这个问题
- HashMap大小为9365
改进方式:HashMap换为ConcurrentHashMap
错误的加锁
1 | public class BadLockOnIntegerTest implements Runnable { |
运行这段代码,期望输出2000,但是返回1415,原因是Integer属于不变对象。i++
在真实执行时变成了i=Integer.valueOf(i.intValue()+1);
导致每次加锁加到了不同的对象实例上。
改进方式:synchronized(i)
修改为synchronized(instance)