[concurrency-interest] Initializing a map inside a constructor
tackline at tackline.plus.com
Mon Mar 5 15:08:15 EST 2007
Bob Lee wrote:
> On 3/5/07, *Howard Lewis Ship* <hlship at gmail.com
> <mailto:hlship at gmail.com>> wrote:
> I often have classes with a final field of type Map.
> I initialize the Map, loading values inside the constructor. I never
> change the contents
> of the Map outside of the constructor.
> You should be fine so long as you don't let the "this" reference escape
> from the constructor (I assume this is the case), and if you create the
> enclosing object in one thread and access it from another, you must pass
> the object off in a thread safe manner.
My understanding is that you do not have to publish safely, as it is a
final field. The canonical example is the char array in String.
Also a point of note that the JLS isn't very clear on is that it's the
constructor of the class holding the field that is important, not the
constructor of the leaf implementation class. You should be able to
publish this from subclass constructors.
Of course it depends upon the (probably undocumented) implementation of
the Map. HashMap you should be fine. Anything lazy, or dynamically
optimising, or something like WeakHashMap, and you could be in trouble.
More information about the Concurrency-interest