提问人:1earing 提问时间:7/25/2023 最后编辑:1earing 更新时间:7/25/2023 访问量:54
java同步我怎么能理解
java synchronized how can i understand it
问:
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()
答:
0赞
Andy Turner
7/25/2023
#1
这里有两个问题:
你启动线程,但你不等待它们完成,使用
Thread.join()
您不会将主线程对列表的访问与 and 调用同步。
size()
stream()
请注意,
ArrayList
的 Javadoc 说:如果多个线程同时访问一个 ArrayList 实例,并且至少有一个线程在结构上修改了列表,则必须在外部同步该列表。
也许很容易忘记主线程是像其他线程一样的线程,因此您也需要在那里进行同步。
上一个:这种实现是否正确?
评论
list.size()
list.stream()....toString()
add