Details
Description
The following sample demonstrates a deadlock between the SynchronizationInterceptor lock and the Component.getInstanceFromFactory factoryLock:
@Stateful @Scope(ScopeType.SESSION) @Name("test") public class TestAction implements Test { public String test() { Thread.sleep(500); Component.getInstance("foo", true); return "test"; } @Factory(value="testString", scope=ScopeType.EVENT) public String getTestString() { return "testString"; } @Remove public void remove() {} }
@Name("testProducer") public class TestProducer { @Factory(scope=ScopeType.EVENT) public String getFoo() { return "foo"; } }
when test.xhtml contains:
<h:outputText value="#{test.test()} " />
and othertest.xhtml contains:
<h:outputText value="#{testString} " />
If the othertest.seam is requested just after (<500ms after) the test.seam with the same session cookie.
The problem seems to be that the #
{test.test()}first locks the TestAction SynchronizationInterceptor lock and then the Seam factoryLock in the Component.getInstance call, while #
{testString}locks the factoryLock first.