我们知道List集合不安全的是因为add()方法没有使用synchronized,我们知道jdk很早有个Vector类,看看它的add()
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
因为它有synchronized,这才是它是线程安全的.
public class ListDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
for(int i=0;i<3;i++){
new Thread(){
@Override
public void run() {
list.add(ListDemo.class.getSimpleName().substring(0,8));
System.out.println(list);
}
}.start();
}
}
}
打印结果:
[ListDemo]
[ListDemo, ListDemo]
[ListDemo, ListDemo, ListDemo]
你会发现集合的size不对,
那么如何解决呢?