Hi All,

I am wondering why calling javax.servlet.Servlet#getServletConfig() is
thread safe: if you check the implementation in
 javax.servlet.GenericServlet from servlet API 3.0.1, you see the following:

package javax.servlet;

// lines omitted

public abstract class GenericServlet
    implements Servlet, ServletConfig, java.io.Serializable
{
    // lines omitted

    private transient ServletConfig config;

    // lines omitted

    public void init(ServletConfig config) throws ServletException {
    this.config = config;
    this.init();
    }

    // lines omitted

    public ServletConfig getServletConfig() {
    return config;
    }
    // lines omitted
}


The field config is written in init(ServletConfig) without any
synchronization, locking or config being volatile, while getServletConfig()
could be called anytime from any later worker thread of the servlet
container. I took a quick look into Tomcat/Catalina code base, however I
see no indication of the servlet container performing any magic, which
would guarantee thread safe access to field config through
getServletConfig() from e.g.
javax.servlet.GenericServlet#service(ServletRequest, ServletResponse) and
the corresponding methods in javax.servlet.http.HttpServlet.

Am I missing something here? What will guarantee that if Thread A is used
to init(ServletConfig) then Thread B calling getServletConfig() will see
the correct state of the field config (Java "happens-before"), and not e.g.
null?

I am asking this because I have seen some legacy code, where a servlet
stored something into a field inside the init() method, which was then used
from within a javax.servlet.http.HttpServlet#doGet or
javax.servlet.http.HttpServlet#doPost method, without synchronization of
any kind like this:

public class FoobarServlet extends HttpServlet {

    private FoobarService foobarService;

    @Override
    public void init() throws ServletException {
this.foobarService = // ... acquire foobarService
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
        List<Foobar> foobars = this.foobarService.getFoobars(); // read the
field WITHOUT synchronization
        // ...
    }
    // ...
Is this approach (having no synchronization, locking or the field being
volatile) correct? I assumed it is not, seeing something like that in the
servlet API is quite confusing.


What do you think?

Thanks,
Peter

Reply via email to