Directly from this web site, I came across the following description about creating object thread safety.
Warning: When constructing an object that will b
Let us assume, you have such class:
class Sync {
public Sync(List list) {
list.add(this);
// switch
// instance initialization code
}
public void bang() { }
}
and you have two threads (thread #1 and thread #2), both of them have a reference the same List
instance.
Now thread #1 creates a new Sync
instance and as an argument provides a reference to the list
instance:
new Sync(list);
While executing line // switch
in the Sync
constructor there is a context switch and now thread #2 is working.
Thread #2 executes such code:
for(Sync elem : list)
elem.bang();
Thread #2 calls bang()
on the instance created in point 3, but this instance is not ready to be used yet, because the constructor of this instance has not been finished.
Therefore,