[ 
https://issues.apache.org/jira/browse/VELOCITY-536?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12486066
 ] 

Christopher Schultz commented on VELOCITY-536:
----------------------------------------------

"Even though those instructions may be re-ordered, they should both be 
completed before another thread enters the block. So their order doesn't 
matter."

Since "init" is being checked before the synchronized block, the ordering of 
the "init=true" is certainly relevant. If the VM or JIT sets init=true before 
constructing the object, the other thread is hosed because it skips the 
synchronized block entirely and gets a reference that is potentially invalid.

JSR-133 has addressed re-orderings with respect to volatile members, and I'm 
not sure I fully understand why this fixes DCL, but, as Nathan points out, we 
cannot assume Java 1.5 availability, so we should avoid DCL at least for now.


> Velocity Engine throws NullPointer Exception when two people click on the 
> same page at the same time for the first time
> -----------------------------------------------------------------------------------------------------------------------
>
>                 Key: VELOCITY-536
>                 URL: https://issues.apache.org/jira/browse/VELOCITY-536
>             Project: Velocity
>          Issue Type: Bug
>          Components: Engine
>    Affects Versions: 1.5
>            Reporter: Lei Gu
>         Attachments: 536-patch.txt, ASTDirective.java, ASTSetDirective.java, 
> VelocimacroProxy.java
>
>
> Multi-thread concurrency issue
> During our concurrency testing, we observed NullPointer exceptions being 
> thrown when two people hit the same page at the same time for the first time. 
> Upon further investigation, it turns out that we need to synchronize the init 
> method on ASTDirective, ASTSetDirective, and render method on 
> ASTSetDirective, and VelocimacroProxy.
>  Basically, the problem is introduced as the following; when two threads 
> attempts to parse and render the same template at the same time. Thread1 
> finishes parsing first and proceeds to the render method call, while thread 2 
> is still busy parsing and will overwrite the existing parse tree that is 
> being used by thread 1 for rendering purpose. Thus under certainly condition 
> a NullPointer exception will be thrown. 

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to