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
相关推荐
qt 多线程 防止主线程做循环操作导致界面假死。试过多线程的几种方法,只有这个方法可行。代码亲测可行。在子线程死循环,界面正常不死!!!
主要介绍了Java中一个线程执行死循环有什么后果,当一个线程在执行死循环时会影响另外一个线程吗,下面为大家揭晓
多线程中使用循环队列
C# 多线程界面假死解决,正确使用多线程 C# 多线程界面假死解决,正确使用多线程 C# 多线程界面假死解决,正确使用多线程 C# 多线程界面假死解决,正确使用多线程 C# 多线程界面假死解决,正确使用多线程 没分的朋友...
java多线程并发控制通信,用hibernate存储信息,数据库mysql.
C#多线程解决界面卡死问题的完美解决方案,简化了之前的写法,更容易记住和理解 C#多线程解决界面卡死问题的完美解决方案,简化了之前的写法,更容易记住和理解
c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程...
实现多线程读写缓冲区的小例子。一个任务读文件并写入缓冲区,一个任务从缓冲区读内容写到文件,缓冲区可循环。读大文件请稍微改下缓冲区大小。
C#多线程解决界面卡死问题的完美解决方案
多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程
本文简介了pthread的用法,介绍了多核多线程编程的入门知识
多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子
C#用了多线程界面卡死
winform datagridview多线程出现红叉解决方案,只要将运行的代码由创建线程调用就OK了
MutilTask 多线程demo。支持 Start 启动,Stop停止,Pause暂停,Continue 恢复。支持线程数量控制。
Qt 多线程及简单实例 demo。 多线程的几大特点: 1.多线程的执行顺序无法保证,与操作系统的调度策略和线程优先级等因素有关。 2.多线程的切换可能发生在任何时刻、任何地点。 3.多线程对代码的敏感度高,因此对...
C#_细说多线程(上下)
C# WinForm多线程防止界面假死源码,代码里面包含显示进度的例子,针对多线程使用的一个很好例子。供初级人员参考。
Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...
C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例),可直接运行