You're right, a container is free to instantiate a servlet class multiple times as it sees fit.
Recently, a customer proposed us to reimplement the JbpmThreadsServlet as a servlet context listener, which is guaranteed to execute only once. I filed the request as JBPM-742, but haven't found the time to implement it yet.
For backwards compatibility, static variables are not the right choice because you could have thread servlets in several web modules. The servlet context comes in handy here.
Thanks for the reply. Yeah, it would seem that the ServletContextListener would probably be the logical way to implement it. Seems simple enough -- in fact, I'll probably have to do that for my application anyway.