[
https://issues.apache.org/jira/browse/JELLY-277?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12699709#action_12699709
]
Frank commented on JELLY-277:
-----------------------------
Since the variable jellyProperties is static making the method synchronized is
not enough; there will still be race conditions between different instances of
XMLParser.
First it should be clear what the desired behaviour is:
- is it essential that the properties are loaded only once, or
- is it just a cache to avoid processing each time
In the first case it is probably best to load the properties in a static block,
through a static synchronized method or in a block synchronized on a static
instance.
private static Properties jellyProperties;
static {
jellyProperties = xxx;
}
or
protected synchronized Properties getJellyProperties() {
return _getJellyProperties();
}
protected static synchronized Properties _getJellyProperties() {
if (jellyProperties == null) {...}
...
}
or
protected synchronized Properties getJellyProperties() {
synchronized (this.getClass()){
if (jellyProperties == null) {...}
...
}
In the second case it is enough to first fill a local Properties object before
assigning it to the static variable; and not first assign it and then fill it
because that corrupts the test on the 'nullness' of the jellyProperties. This
avoids any additional synchronization but might get the properties to be filled
in a number of times in parallel. As long as the properties are never modified
this should be enough.
protected synchronized Properties getJellyProperties() {
if (jellyProperties == null) {
Properties tmpJellyProperties = new Properties();
...
jellyProperties = tmpJellyProperties;
}
...
> XMLParser.configure is not threadsafe.
> --------------------------------------
>
> Key: JELLY-277
> URL: https://issues.apache.org/jira/browse/JELLY-277
> Project: Commons Jelly
> Issue Type: Bug
> Components: core / taglib.core
> Affects Versions: 1.0
> Environment: Linux 64bits, JDK build 1.6.0_01-b06
> Reporter: Yung-Lin Ho
>
> XMLParser will try to load jelly.properties from disk when it first being
> used. However, because XMLParser.configure method is not threadsafe, when I
> tried to run multiple jelly scripts/instance at the same time, XMLParser
> threw out the following error message
> java.lang.ClassNotFoundException: core
> at
> org.apache.tools.ant.AntClassLoader.findClassInComponents(AntClassLoader.java:1166)
> at org.apache.tools.ant.AntClassLoader.findClass(AntClassLoader.java:1107)
> at org.apache.tools.ant.AntClassLoader.loadClass(AntClassLoader.java:977)
> at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
> at org.apache.commons.jelly.parser.XMLParser.createTag(XMLParser.java:985)
> java.lang.ClassNotFoundException: core
> at
> org.apache.commons.jelly.parser.XMLParser.createSAXException(XMLParser.java:1180)
> at org.apache.commons.jelly.parser.XMLParser.createTag(XMLParser.java:990)
> at
> org.apache.commons.jelly.parser.XMLParser.startElement(XMLParser.java:593)
> In order to fix this problem, we have to make ensureConfigured() and
> configure() synchronized methods.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.