ToB企服应用市场:ToB评测及商务社交产业平台

标题: 线程安全与线程不安全 [打印本页]

作者: 北冰洋以北    时间: 2025-1-18 10:01
标题: 线程安全与线程不安全
线程安全的概念



同步与异步的区别


简朴示例
  1. // 同步方法
  2. public String fetchDataSync() {
  3.     return "Data fetched synchronously";
  4. }
  5. // 异步方法
  6. public CompletableFuture<String> fetchDataAsync() {
  7.     return CompletableFuture.supplyAsync(() -> "Data fetched asynchronously");
  8. }
复制代码

Java 的集合类分类及线程安全性

Java 的集合类重要分为两大接口:Collection 和 Map,下面具体列出:
1. Collection 接口的子接口


2. Map 接口


线程安全集合的实现方式


总结

   保举使用并发集合(如 ConcurrentHashMap),尽量制止老旧的线程安全集合(如 Vector、HashTable)。
  Java 中的某些集合类(如 ArrayList, HashMap 等)是线程不安全的,由于它们没有在内部实现同步机制。如果在多线程环境中多个线程并发访问这些集合,会由于数据竞争或操作冲突导致数据不划一不可预测的举动。下面具体说明 为什么它们是线程不安全的

线程不安全的缘故原由

1. 缺少同步机制

这些集合类的方法中没有对关键操作(如插入、删除、读取、更新等)举行同步控制,多个线程可以同时访问和修改共享数据,可能导致数据的竞争。例如:


2. 竞态条件(Race Condition)

竞态条件是指当多个线程同时访问和修改共享资源时,结果依靠于线程的实行次序,而这种次序是不可控的。


3. 缺乏原子性

Java 集合类的一些操作不是原子性的。例如 ArrayList.add() 并不是一个原子操作,而是由多步操作组成的:
如果多个线程同时实行这些步骤,可能出现:


线程不安全的常见问题

1. 数据丢失

多个线程同时对集合举行写操作,导致某些数据被覆盖或丢失。
  1. List<Integer> list = new ArrayList<>();
  2. IntStream.range(0, 1000).parallel().forEach(list::add);
  3. System.out.println(list.size());  // 结果可能小于 1000
复制代码
2. 数据布局损坏

当多个线程并发操作 HashMap 时,可能导致哈希桶布局被粉碎(如链表被断开),从而抛出异常。
3. 并发修改异常

当一个线程正在迭代集合时,另一个线程修改了集合,可能抛出 ConcurrentModificationException。
  1. List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
  2. for (Integer num : list) {
  3.     if (num == 2) {
  4.         list.remove(num);  // 抛出异常
  5.     }
  6. }
复制代码

如何解决线程不安全问题?


总结


线程安全是以性能为代价换取数据划一性的,因此在选择线程安全集合时,要根据具体的场景权衡效率和安全性。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4