一般的集合,如ArrayList、HashSet、HashMap等,都是线程不安全的。不安全的表现是什么?
ConcurrentModifyException
都知道,在遍历集合的时候不能对集合进行添加和删除操作,否则就会抛这个一场。如果一个线程正在遍历一个集合的时候另外一个线程往这个集合中增加或删除了元素,那么程序就会出这个异常。
这个异常的原理是,集合中有一个版本号,每次修改(添加或删除)集合的时候,版本号都会往上涨。当开始遍历集合的时候,先记录下这个版本号,在遍历期间,如果发现这个版本号和集合当前的版本号不等,就会抛这个异常。
死循环
集合的hasNext方法实现如下:
public boolean hasNext() {
return cursor != size;
}
判断的是当前的游标是否和集合的大小相等。
当一个线程在遍历集合的时候,cursor是一直往上涨的,直到“遇到"cursor==size()。一种情况是,刚好在这个线程快要结束遍历,即游标的值刚好等于size的时候,另外一个线程不小心从集合中remove了一个元素,那么size()就减小了,cursor不等于size了,然后cursor继续往上涨。这样,cursor就和size擦肩而过,永远也不能"
相见"了,于是死循环了。
为此,Java提供了线程安全的集合,例如ConcurrentHashMap,CopyOnWriteArrayList。这些集合是线程安全的。不会出现ConcurrentModifyException和死循环的问题。
分享到:
相关推荐
在这个项目中,开发者将学习如何利用Java的并发工具如Thread类和Runnable接口来创建和管理多个线程,同时确保在文件传输过程中的数据一致性和传输效率。此外,项目还涵盖了异常处理、网络IO操作、文件IO操作等核心...
线程安全性:由于涉及多线程并发处理,需要考虑线程安全性。可以使用Java中的同步机制,如使用synchronized关键字或者使用线程安全的集合类来保证多线程操作的安全性。 实现步骤: 创建一个下载管理器类,用于管理...
Java 多线程与并发(14_26)-JUC集合_ CopyOnWriteArrayList详解
Java 多线程与并发(16_26)-JUC集合_ BlockingQueue详解
Java 多线程与并发(15_26)-JUC集合_ ConcurrentLinkedQueue详解
Java 多线程与并发(13_26)-JUC集合_ ConcurrentHashMap详解
多线程并发集合资料.zip
这是一个关于java面试的技术文档,里面包含一个中等难度的面试编程题,主要覆盖的java技术范围是JAVA集合框架和多线程并发,文档中有题目的清晰描述并附有完整的实现代码,同时还包括相关技术点的解析,适合java求职...
java多线程并发查询数据库,使用线程池控制分页,并发查询。
一、理论基础 ... 6.3 并发集合 6.4 原子类 6.5 线程池 七、BlockingQueue 八、ConcurrentHashMap 九、CopyOnWriteArrayList 十、原子类-CAS, Unsafe和原子类详解 十一、JUC锁: LockSupport详解
Task task = BlockingCollectionUtil.AddTakeBlockingCollectionAsync(); Task.WaitAny(task); BlockingCollectionUtil.TryTakeBlockingCollection(); ConcurrentBagUtil.Test(); ConcurrentDictionaryUtil....
并发集合:JUC提供了一些线程安全的集合类,如ConcurrentHashMap、ConcurrentLinkedQueue等,可以在多线程环境下安全地访问和修改集合。 原子操作:JUC提供了一些原子操作类,如AtomicInteger、AtomicLong等,可以...
这就有可能导致A线程和B线程同时对一个数组扩容,A线程扩容后替换掉老数组,这时B线程使用的数组实际上是A线程扩容后的数组,就会产生线程安全问题。 死锁原因 比如,当前集合数组长度为2,已经有两个元素被放在了...
多线程源码JUC以及多线程和高并发 https://blog.csdn.net/u011488009 主要是根据 https://blog.csdn.net/u011488009/category_9678616.html 专栏来讲解的源码,都可以作为高并发的学习,练手用,主要是看这个源码...
select:将文件描述符放入一个集合中,调用select时,将这个集合从用户空间拷贝到内核空间(缺点:每次都要复制,开销大),由内核根据就绪状态修改该集合的内容。 poll:和select几乎没有区别,区别在于文件描述符...
包含了JVM、java集合、多线程并发、java基础、spring生态原理、微服务、设计模式、NETTY与RPC、网络、日志、ZOOKEEPER、KAFKA、RABBITMQ、HBASE、MONGDB、CASSANDRA、负载均衡、数据库、一致性算法、java算法、数据...
从多线程的基础、线程同步、线程间通信、线程调度、线程池、并发容器、线程安全的集合、原子变量等方面去罗列主要知识点,以思维导图的方式进行呈现,可以让读者更条理清晰的在最短的时间内掌握多线程的主要知识
主要介绍了详解java各种集合的线程安全,小编觉得挺不错的,这里分享给大家,供需要的朋友参考。
ConcurrentSkipListSet 是Java中的一个线程安全的有序集合类,它基于跳表(Skip List)数据结构实现。 下面是关于 ConcurrentSkipListSet 的一些重要信息: 线程安全性:ConcurrentSkipListSet 是线程安全的,可以...
内容概要:最新2023年Java高并发多线程后端面试题整理, 包含线程池,并发集合,volatile,CountDownLatch,Semaphore,Phaser,AQS,ReentrantLock,ReentrantLock等等问题, 用简洁明了的语言,通俗易懂地阐述了高...