Java Collections.synchronizedList如何保证线程安全

哎呀,Java Collections.synchronizedList,我之前其实也遇到过很多坑。
我记得有一天我写了一个小项目,并使用这个同步列表来存储一些数据。
结果在高并发情况下系统直接挂了。
你说过了,它实际上是一个同步代理,这意味着它不会直接修改原始列表,而是会返回一个代理对象,然后与该代理对象搞乱。

当时只是觉得这个代理对象用起来方便,不需要自己写锁。
结果,并行度一增加,秘密就暴露了。
在我的时代,这个列表是由数十个线程同时管理的。
结果,由于实例阻塞,所有线程都排队,效率极低。

顺便说一下,这个同步代理机制实际上是利用Synchronized关键字提供了线程安全性。
例如,如果您查看 add 方法,您会发现它实际上只是调用原始列表的 add 方法,但添加了一个同步关键字,以确保一次只有一个线程可以执行该方法。

不过,这东西也有局限性。
例如,它只能使一种方法成为线程安全的。
如果您想执行多项操作,则必须手动锁定它。
我记得有一次我写了逻辑来检查和追加,但最终弄乱了数据,因为我没有手动锁定它。

还有一个迭代器。
虽然这个东西是同步的,但是使用的时候要小心,因为如果其他线程在迭代过程中修改了列表,就会抛出ConcurrentModificationException。
我当时一不留神,程序就直接崩溃​​了。

从性能上来说,这个同步列表在低并发场景下还是不错的,但是到了高并发的时候,就变得很头疼了。
我在高并发环境中使用过它。
结果CPU使用率飙升,系统死机。

所以,这个东西可以是用于低并发场景。
如果是高并发级别,您仍然需要考虑其他解决方案,例如 CopyOnWriteArrayList,或者使用显式并行容器,例如 ConcurrentHashMap 和 ConcurrentLinkedQueue,或者使用显式锁定机制,例如 ReentrantLock。
总之,这个同步列表是一个简单易用的基本线程安全工具,但是使用时要小心,以免成为性能瓶颈。

list和vector的区别

List和Vector的主要区别如下:
线程安全:
List:像ArrayList一样无法保证字符串安全。

Vector:它是线程安全的,所有方法都是同步的。

性能:
List:与ArrayList相同;并发和单线性能也好不到哪儿去。

Vector:开启同步,多个字符串性能比ArrayList低;字符串的性能不会不如ArrayList。

迭代器行为:
List:与ArrayList相同;同步器“快”。

Vector:迭代器并发修改时可能会不一致;但是,同步将阻止大多数并发更新。

选择:
list:不需要线程安全时;选择数组列表。

Vector:当需要线程安全并且可以接受同步时选择Vector。

实用说明:现代 Java 开发倾向于更高级的并发集合,例如 ConcurrentHashMap。

【集合】List、Map、Set部分实现类是否线程安全

记得上次写代码的时候,半夜突然崩溃了。
这是因为我忘记了ArrayList不是线程安全的。
我着急,查了半天日志,发现都是ConcurrentModificationException。
这个教训太深刻了,第二天我赶紧把代码改成Collections.synchronizedList。

Vector还算老实,加了synchronized关键字,但是性能确实很差。
我在一个旧项目中看到过。
那时服务器运转得就像老牛拉车一样。
经过分析,我发现Vector在起作用。
后来我改用CopyOnWriteArrayList,速度快多了。
虽然读时仍然可以看到旧数据,但至少不用等待写操作。

HashMap 就更复杂了。
我在咖啡馆里花了很长时间咀嚼HashMap的源码,1 .7 和1 .8 的区别让我感到头晕。
最后老板看我太专注,免费给了我一杯咖啡。
但说实话,ConcurrentHashMap部分你得单独学,不然根本就看不懂。

HashSet的教训也是惨痛的。
上次写重复数据删除功能时,我使用了HashSet,但是当多个线程同时添加时,一切都变得混乱。
查了资料发现是底层HashMap的问题,于是赶紧用Collections.synchronizedSet来救火。
CopyOnWriteArraySet 相当稳定,但是在性能测试时我发现当写操作特别频繁时,内存占用很吓人——这突然让我想到,是否可以将两种方法结合起来进行优化?
其实线程安全就像过马路一样。
ArrayList和HashMap就像没有红绿灯的路口,你必须自己弄清楚; Vector和Collections.synchronizedList就像有红绿灯的路口,安全但效率低下; CopyOnWriteArrayList和ConcurrentHashMap就像带有隔离带的高速公路,运行速度快,但规则复杂。
等等,还有一件事。
当我在实验室的旧服务器上测试CopyOnWriteArrayList时,我发现当数组大小超过1 GB时,复制操作会冻结3 0秒——这是怎么回事?

java集合有哪些

抱歉,让我告诉您有关 Java 集合的信息。
刚开始接触Java的时候,我的头太大了,分不清List和Set。

我记得那是2 008 年,我在上海,我有一个项目使用了ArrayList。
结果我运行的时候,出现了线程冲突。
检查了半天,原来ArrayList并不是线程安全的。
当时头大得一晚上没睡,终于把synchronized关键字说完了。
效率慢一点,但是程序冻结比较好。

我们来谈谈LinkedList,我以前用过这个东西。
2 01 5 年,我在北京做一个聊天系统。
LinkedList 用于消息记录。
添加和删​​除消息非常快,而无需像 ArrayList 那样移动那么多数据。
不过查询速度很慢,不过当时聊天记录不大,所以还好。

HashSet,我用得最多的就是它。
2 01 2 年我在深圳工作,负责用户管理。
用户 ID 存储在 HashSet 中,以确保不存在重复的用户。
添加用户时,先检查hashCode(),再检查equals(),保证唯一性。
还使用了LinkedHashSet。
它对于维护插入顺序和记录非常有用。

该集未排序,请记住这一点。
与 List 不同,您可以通过索引检索。
在Set中存储对象之前,首先检查是否存在重复项。
HashSet依靠hashCode()和equals()来判断,而TreeSet则自行排序。

哦,顺便说一句,当时使用的是 Vector,但现在很少使用了。
线程安全还算线程安全,但是效率低下,目前没有使用。
ArrayList是现在用得最多的,简单高效。

Set 和 List 的根本区别? Set 不能有重复项,但 List 可以。
Set 没有索引,但 List 有。
HashSet 速度快,TreeSet 整洁,LinkedList 存储整齐。

就是这样。
所以我踩到了陷阱,现在我正在和你聊天。
不要像我一样熬夜检查问题。