import java.util.ArrayList;
import java.util.List;
public class unsafeList {
public static void main(String[] args) throws InterruptedException {
List<String> list = new ArrayList<>();
for (int i = 0; i < 101; i++) {
int finalI = i;
new Thread(() -> {
synchronized (list) {
list.add(Integer.toString(finalI));
}
}).start();
}
// Thread.sleep(100);
System.out.println(list.size());
String string = list.stream()
.map(Integer::valueOf)
.reduce(0, Integer::sum)
.toString();
System.out.println(string);
}
}
输出: 93 5050 输出2: 101 5050 我给链表加了同步锁,保证ArrayList能够安全的添加信息,但是打印出来的数字并没有想象中的那么多,然后我进行累加操作,发现得到的值是正确的结果。 如果我将
list.size
更改为 list.stream.count()
方法,那就是正确的结果,我应该如何理解它?
这里有两个问题:
Thread.join()
您不会通过
size()
和 stream()
调用同步从主线程对列表的访问。
请注意 ArrayList
如果多个线程并发访问一个ArrayList实例,并且至少有一个线程在结构上修改了列表,则必须进行外部同步。
可能很容易忘记主线程与其他线程一样,因此您也需要同步。