Question: Consider the following class:

```
public class MyClass
{
    private MyObject obj;

    public MyClass()
    {
        obj = new MyObject();
    }

    public void methodCalledByOtherThreads()
    {
        obj.doStuff();
    }
}

```

Since obj was created on one thread and accessed from another, could obj be null when methodCalledByOtherThread is called? If so, would declaring obj as volatile be the best way to fix this issue? Would declaring obj as final make any difference?

Edit:
For clarity, I think my main question is:
Can other threads see that obj has been initialized by some main thread or could obj be stale (null)?

Answer: 
It depends on whether the reference is published "unsafely". A reference is "published" by being written to a shared variable; another thread reads the variable to get the reference. If there is no relationship of `happens-before(write, read)`, the publication is called unsafe. An example of unsafe publication is through a non-volatile static field.

@chrylis 's interpretation of "unsafe publication" is not accurate. Leaking `this` before constructor exit is orthogonal to the concept of unsafe publication. 

Through unsafe publication, another thread may observe the object in an uncertain state (hence the name); in your case, field `obj` may appear to be null to another thread. Unless, `obj` is `final`, then it cannot appear to be null even if the host object is published unsafely.

This is all too technical and it requires further readings to understand. The good news is, you don't need to master "unsafe publication", because it is a discouraged practice anyway. The best practice is simply: never do unsafe publication; *i.e.* never do data race; *i.e.* always read/write shared data through proper synchronization, by using `synchronized, volatile` or `java.util.concurrent`.

If we always avoid unsafe publication, do we still *need* `final` fields? The answer is no. Then why are some objects (e.g. `String`) designed to be "thread safe immutable" by using final fields? Because it's assumed that they can be used in malicious code that tries to create uncertain state through deliberate unsafe publication. I think this is an overblown concern. It doesn't make much sense in server environments - if an application embeds malicious code, the server is compromised, period. It probably makes a bit of sense in Applet environment where JVM runs untrusted codes from unknown sources - even then, this is an improbable attack vector; there's no precedence of this kind of attack; there are a lot of other more easily exploitable security holes, apparently.
This code is fine because the reference to the instance of `MyClass` can't be visible to any other threads before the constructor returns.

Specifically, the [happens-before relation](http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4.5) requires that the visible effects of actions occur in the same order as they're listed in the program code, so that in the thread where the `MyClass` is constructed, `obj` must be definitely assigned before the constructor returns, and the instantiating thread goes directly from the state of not having a reference to the `MyClass` object to having a reference to a fully-constructed `MyClass` object.

That thread can then pass a reference to that object to another thread, but all of the construction will have transitively happened-before the second thread can call any methods on it. This might happen through the constructing thread's launching the second thread, a `synchronized` method, a `volatile` field, or the other concurrency mechanisms, but all of them will ensure that all of the actions that took place in the instantiating thread are finished before the memory barrier is passed.

Note that if a reference to `this` gets passed out of the class inside the constructor somewhere, that reference might go floating around and get used before the constructor is finished. That's what's known as *unsafe publishing* of the object, but code such as yours that doesn't call non-`final` methods from the constructor (or directly pass out references to `this`) is fine.