java同步我怎么理解它

问题描述 投票:0回答:1
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()
方法,那就是正确的结果,我应该如何理解它?

java synchronized
1个回答
0
投票

这里有两个问题:

  1. 您启动线程,但不等待它们完成,使用

    Thread.join()

  2. 您不会通过

    size()
    stream()
    调用同步从主线程对列表的访问。

    请注意 ArrayList

    Javadoc 说:

    如果多个线程并发访问一个ArrayList实例,并且至少有一个线程在结构上修改了列表,则必须进行外部同步。

    可能很容易忘记主线程与其他线程一样,因此您也需要同步。

© www.soinside.com 2019 - 2024. All rights reserved.