You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by bu...@apache.org on 2003/12/24 21:32:51 UTC

DO NOT REPLY [Bug 25748] - Synchronization issues in ThreadPool.java

DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=25748>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://nagoya.apache.org/bugzilla/show_bug.cgi?id=25748

Synchronization issues in ThreadPool.java





------- Additional Comments From dice@east.sun.com  2003-12-24 20:32 -------
Briefly, worker threads in the ControlRunnable class execute a loop of the form:
    for 
       // toRun, shouldRun, shouldTerminate are non-volatile instance variables
       synchronized(this) { if (!shouldRun && !shouldTerminate) wait(); }
       ...
       re-read shouldRun, shouldTerminate
       fetch job description from toRun
       perform work describec by toRun
       clear shouldRun, shouldTerminate, etc. 

Instead, I think it'd be safer to use code of the form
    for 
       synchronized (this) { 
          while (!shouldRun && !shouldTerminate) wait(); 
          copy shouldRun, shouldTerminate, toRun etc into temporary auto
          auto variables _shouldRun, _shouldTerminate, _toRun, etc.
          clear shouldRun, shouldTerminate, etc.
       }
       check _shouldRun, _shouldTerminate
       perform work described by _toRun
   

See Josh Bloch's "Effective Java" book, chapter 50, for details.
In addition, running Bill Pugh's "BugFinder" on the class files might turn up
other issues.

We've encountered this bug during large application stability testing at Sun. 
Fixing the code (as described above) seemed to remedy the problem.

---------------------------------------------------------------------
To unsubscribe, e-mail: tomcat-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tomcat-dev-help@jakarta.apache.org