Issue #1968 Prevent deadlock on thinclient startup

Change-Id: I522082d3c633b583e9b72941ec17464731ceba5e

Former-commit-id: a4f5efb30e [formerly 7ba7863740] [formerly ff6220147b] [formerly a4f5efb30e [formerly 7ba7863740] [formerly ff6220147b] [formerly dbd1f3d5e5 [formerly ff6220147b [formerly fd9305775d1c0de574d1c0c9b47aac911b356de6]]]]
Former-commit-id: dbd1f3d5e5
Former-commit-id: f8f1904c75 [formerly d9de37190d] [formerly 4a1c19cd5ef49ce5844d32126a91ca862df4d3ad [formerly 0929802c01]]
Former-commit-id: 4a884adba09890a691d502ceddc27714db33590c [formerly 17be4bbb77]
Former-commit-id: 6dd7964b7d
This commit is contained in:
Dustin Johnson 2013-05-01 15:48:15 -05:00
parent a81b2de3b8
commit 9120b57b4f

View file

@ -45,6 +45,7 @@ import com.raytheon.uf.common.util.ServiceLoaderUtil;
* to accept class parameter, deprecate old versions. Improve performance
* of getJaxbManager().
* Feb 07, 2013 1543 djohnson Use ServiceLoader to find how to load jaxbable classes, defaulting to SerializableManager.
* May 01, 2013 1968 djohnson Prevent deadlock due to SerializableManager threads needing to serialize things.
*
* </pre>
*
@ -54,10 +55,6 @@ import com.raytheon.uf.common.util.ServiceLoaderUtil;
public final class SerializationUtil {
private static final IJaxbableClassesLocator jaxbableClassesLocator = ServiceLoaderUtil
.load(IJaxbableClassesLocator.class,
SerializableManager.getInstance());
private static volatile JAXBManager jaxbManager;
private SerializationUtil() {
@ -79,7 +76,12 @@ public final class SerializationUtil {
synchronized (SerializationUtil.class) {
result = jaxbManager;
if (result == null) {
List<Class<ISerializableObject>> jaxbClasses = jaxbableClassesLocator
// This cannot be eagerly created as
// SerializableManager.getInstance() spawns threads which
// were causing a deadlock
List<Class<ISerializableObject>> jaxbClasses = ServiceLoaderUtil
.load(IJaxbableClassesLocator.class,
SerializableManager.getInstance())
.getJaxbables();
jaxbManager = result = new JAXBManager(
jaxbClasses.toArray(new Class[jaxbClasses.size()]));