这个,
java.lang.Thread.State: RUNNABLE at java.util.HashMap.hash(HashMap.java:351) at java.util.HashMap.putForCreate(HashMap.java:512) at java.util.HashMap.putAllForCreate(HashMap.java:534) at java.util.HashMap.<init>(HashMap.java:320)
还有这个,
java.lang.Thread.State: RUNNABLE at java.util.HashMap.getEntry(HashMap.java:446) at java.util.HashMap.get(HashMap.java:405)
是已知的线程安全问题,
java.util.HashMap其中一个线程
get()同时调用另一个线程同时调用a
put()。线程将在计算哈希值时陷入无限循环。解决此问题的技术方法是改用
ConcurrentMap实现。另请参见此dzone文章。
但是,根据您的具体情况,
at java.util.HashMap.<init>(HashMap.java:320) at org.ajax4jsf.component.UIDataAdaptorbase.createChildStateCopy(UIDataAdaptorbase.java:894) at org.ajax4jsf.component.UIDataAdaptorbase.saveState(UIDataAdaptorbase.java:1554) at org.richfaces.component.UIDataTable.saveState(UIDataTable.java:181) at org.richfaces.component.html.HtmlDataTable.saveState(HtmlDataTable.java:1361) at javax.faces.component.UIComponentbase.processSaveState(UIComponentbase.java:1103)
当您
<rich:dataTable>要保存组件的状态时,此问题似乎很明显。这又表明该组件的同一实例正在由多个线程访问。这是不对的,
UIComponent该类从一开始就从来没有被设计为线程安全的。这反过来表明所讨论的组件实例未按JSF规范的要求进行作用域限定。例如,当您
binding用于将组件绑定到会话作用域或什至是应用程序作用域的bean或更糟糕的是静态字段时,可能会发生这种情况。
<x:someComponent ... binding="#{nonRequestScopedBean.someComponent}">您应该在代码库中查找这样的组件,并通过确保bean是请求范围的,或通过对需求/问题使用不同的解决方案(您认为使用
binding此方法是正确的解决方案)来进行相应的修复。



