当两个线程并发地执行一个HashSet的时候,一个线程对HashSet做遍历(Iterator或者for循环,或者.clone()), 另一个线程对它.add或者.remove的时候,会抛出:java.util.ConcurrentModificationException.
而读的时候,hashSet.size(). hashSet.contains(XXX); 则不会发生异常。
解决办法是读的时候加读锁,写的时候加写锁。要注意读写锁必须来自同一个Lock:
Lock writeLock = UserListManager.getUserMsgLock(key).writeLock();
Lock readLock = UserListManager.getUserMsgLock(key).readLock();
同理,对于单线程,也不可以在遍历的时候修改。
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("a1");
list.add("a2");
list.add("a3");
for (String str : list) {
list.add(str + "1");
}
}
也会抛java.util.ConcurrentModificationException.
分享到:
相关推荐
在Windows应用程序开发中,MFC(Microsoft Foundation Classes)框架提供了对多线程的支持,使得开发者可以构建更加复杂的并发系统。MFC中的线程分为两类:工作者线程和用户界面线程,它们各自有不同的特性和用途。 ...
【Windows多线程总结】 Windows操作系统提供了一套完整的API来支持多线程编程,使得开发者可以在同一进程中同时执行多个线程,实现并发处理任务。本文将深入探讨Windows多线程编程的基本概念、线程同步、线程池以及...
Java多线程是Java编程语言中的一个重要特性,它允许开发者创建并发执行的多个线程,从而提高程序的执行效率和响应速度。...理解Java多线程的工作原理和API使用对于开发高性能、高响应的应用程序至关重要。
Java多线程是Java编程中的一个核心概念,它在现代软件开发中扮演着至关重要的角色。多线程允许程序同时执行多个任务,提高了系统资源的利用率,提升了应用程序的响应速度和并发性能。对于大型分布式系统、Web应用...
- **联系**:定时器可以结合多线程使用,例如在工作者线程中设置定时器来定期执行某个任务,或者在用户界面线程中设置定时器来定期刷新界面。 #### 五、线程消息传递 在多线程环境中,线程间通信非常重要。MFC提供...
MFC 多线程完整总结及示例代码 多线程是一种重要的编程技术,用于实现并行处理和提高系统性能。在 MFC 中,多线程编程可以通过 Win32 API 函数和 MFC 类库来实现。在本文中,我们将对多线程的基本概念、多线程编程...
### Java多线程问题总结 #### 一、多线程的作用与优势 1. **发挥多核CPU的优势:** - 当今计算机硬件普遍配备有多核CPU,利用多线程技术能够有效地分配任务到不同的核心上,使得计算资源得到最大化利用。在双核...
本篇文章将深入探讨如何在MFC中创建多线程,特别是工作者线程,并且会针对`AfxBeginThread`和`BeginThread`两种方法进行比较。 首先,我们来看标题所提到的“MFC创建多线程(工作者线程)demo”。工作者线程通常...
### 多线程知识总结 #### 一、线程基础概念 **线程状态:** 在探讨多线程之前,我们需要了解线程的基本状态转换。一个典型的线程生命周期包括以下几个阶段: 1. **Start(启动):** 当线程被创建后调用`start()`...
总结来说,C#中的多线程和线程池是提高程序并发性和性能的重要工具。通过使用`ThreadPool`,开发者可以更高效地利用系统资源,同时保持程序的响应性。在实际应用中,合理地设计和使用多线程能够显著提升计算密集型或...
总结,Qt5的多线程机制是通过QThread类实现的,它允许开发者创建独立的工作线程来处理后台任务,从而保持主线程的流畅性。`WorkThread`是一个很好的实践示例,展示了如何在Qt中自定义线程类并实现线程间的通信。正确...
总结,VB6实现多线程主要通过创建ActiveX EXE工程,并在工程属性中启用“每个对象对应一个线程”选项。在ActiveX EXE中编写线程代码,并在主应用程序中创建实例来启动线程。了解并掌握这些知识点,有助于开发出更...
总结来说,"Qt多线程通讯"DEMO展示了以下关键知识点: 1. Qt的信号槽机制:用于对象间的异步通信。 2. `QThread`类:创建和管理线程,支持QObject的线程迁移。 3. 主线程与子线程通信:主线程发送数据,子线程处理...
- 调试和修改多线程程序时,务必随时保存工作,因为VB6在处理多线程时可能会意外崩溃。 - 使用API函数创建线程时,在程序退出前需要确保所有线程已经结束,否则也会导致“内存不能写”的错误。可以使用`...
总结来说,线程池通过统一管理和复用线程,提高了多线程环境下的效率和稳定性。在文件上传场景中,线程池能有效利用系统资源,加速大文件的上传速度,同时通过合理的任务调度和等待机制,确保上传过程的可靠性和一致...
总结来说,VS2013的MFC多线程多串口编程涉及了Windows API的使用,通过多线程实现串口通信的并发处理,确保多个串口可以同时工作且互不干扰。这在需要处理大量串口数据或连接多个设备的应用场景中尤其重要,比如工业...
此资源可能包含用于分析和调试Android应用的反汇编工具,如dex2jar、JD-GUI等,它们可以帮助开发者查看APK中的字节码和源代码,理解多线程在底层是如何工作的。 总结,这个资源包为Android开发者提供了全面的多线程...
总结,Linux系统的多线程编程为开发者提供了强大的并发能力,但也带来了挑战。理解和掌握线程创建、同步、通信和问题处理,是编写高效、可靠的多线程程序的基础。通过不断实践和学习,我们可以驾驭这一强大的工具,...
Java多线程与并发编程是Java开发中至关重要的一部分,它涉及到如何高效地利用CPU资源,以实现程序的并行执行。在操作系统层面,多任务和多进程是通过分配不同的内存空间来实现的,而线程则共享同一进程的内存,这...