HashMap在多线程下导致死循环的原因可以参考http://mailinator.blogspot.com/2009/06/beautiful-race-condition.html
在多线程环境下,各个线程的Hibernate Session不同,使用Hibernate查询一个实体时,非常罕见的出现了一次,堆栈如下
"pool-130-thread-6" prio=10 tid=0x00002aab010ed800 nid=0x3aba runnable [0x000000004addf000] java.lang.Thread.State: RUNNABLE at java.util.HashMap.put(HashMap.java:391) at org.hibernate.engine.StatefulPersistenceContext.addCollection(StatefulPersistenceContext.java:764) at org.hibernate.engine.StatefulPersistenceContext.addUninitializedCollection(StatefulPersistenceContext.java:733) at org.hibernate.type.CollectionType.getCollection(CollectionType.java:609) at org.hibernate.type.CollectionType.resolveKey(CollectionType.java:408) at org.hibernate.type.CollectionType.resolve(CollectionType.java:402) at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:120) at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:854) at org.hibernate.loader.Loader.doQuery(Loader.java:729) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236) at org.hibernate.loader.Loader.loadEntity(Loader.java:1860) at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:48) at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:42) at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3049) at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:399) at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:375) at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:139) at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:98) at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:878) at org.hibernate.impl.SessionImpl.immediateLoad(SessionImpl.java:836) at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:66) at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111) at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:150
跟踪调试,发现在多个线程中确实存在相同的session,这些session存在于持久化实体中的CGLIB代理里面
由于这些实体对象是在进入多线程环境之前就已经查询出来了,但是他们关联的对象都是lazy-load,所以都以CGLIB的形式存在与这些实体对象中。于是,在多线程环境下,尽管重新生成了新的session,但是通过实体延迟加载时就会使用之前的session,这样就导致了一个错误的用法:并发使用Hibernate的session
相关推荐
40. String与StringBuffer:String是不可变的,StringBuffer在多线程环境中更安全。 41. Overload与Override:Overload是方法重载,可以改变返回类型;Override只能重写已有的方法,不能改变返回类型。 42. ...
6. **多线程**:Java内置了对多线程的支持,通过实现Runnable接口或继承Thread类创建线程。线程同步机制包括synchronized关键字、wait()、notify()和notifyAll()方法。 7. **IO流**:Java的IO流分为字节流和字符流...
- **线程模型**:Java虚拟机如何实现多线程。 #### 2.2 垃圾收集 - **GC算法**:标记-清除、复制算法、标记-整理、分代收集等。 - **垃圾收集器**:Serial、ParNew、Parallel Scavenge、CMS、G1等收集器的特点及其...
- **多线程情况下HashMap死循环的问题**:当多个线程同时进行put操作时可能导致循环链表形成闭环。 - **HashMap出现HashDOS攻击的问题**:恶意构造大量相同的哈希值导致性能下降。 - **ConcurrentHashMap的工作...
Java 语言具有平台独立性、对象oriented、分布式、多线程、动态加载等特点。 1. Java 基础知识 * 什么是 Java?Java 是一种高级编程语言,具有平台独立性、对象oriented、分布式、多线程、动态加载等特点。 * 为...
- 数据一致性问题:多线程环境下需要处理好同步问题,避免数据不一致。 ### 9. 为什么需要使用线程池? 使用线程池可以有效地管理线程资源,减少创建和销毁线程的开销,同时控制并发线程的数量,防止过多线程导致...
6. 扩展性:Lucene可以与其他系统集成,如Spring、Hibernate等,支持分布式搜索和多线程处理。 Heritrix则是一个网络爬虫工具,用于抓取互联网上的网页以便进行进一步的分析和索引。Heritrix提供了强大的配置能力,...
6. **多线程**: - 线程状态:了解新建、就绪、运行、阻塞和死亡五种状态。 - synchronized关键字:理解其用法和同步的作用。 - volatile关键字:知道它如何确保内存可见性。 - Lock接口:对比synchronized与...
五、多线程 1. 线程的创建:Thread类、Runnable接口。 2. 线程同步:synchronized关键字,wait()、notify()、notifyAll()方法。 3. 线程状态:新建、运行、阻塞、等待、死亡等。 4. 线程池:ExecutorService、...
4. **循环引用**:对象之间形成循环引用,可能导致内存泄漏。理解并正确使用弱引用和软引用可以避免此类问题。 5. **忽视异常处理**:不恰当的异常处理可能导致程序在遇到错误时崩溃,而不是优雅地处理问题。应该...
- **多线程与并发**:理解Thread类与Runnable接口的差异,熟悉synchronized关键字的用法,掌握并发编程的基础知识。 #### 4. Java虚拟机(JVM) - **内存模型**:了解JVM的内存布局,包括堆、栈、方法区等部分的...