I have a simple class which does some calculations in its own thread and reports the results to the listener.
class Calculator extends Thread {
    protected Listener listener;
    public void setListener(Listener l) {
        listener = l;
    }
    public void run() {
        while (running) {
            ... do something ...
            Listener l = listener;
            if (l != null) {
                l.onEvent(...);
            }
        }
    }
}
At any time, the user can call setListener(null) if he doesn't want any events for a certain time period. So, in the run() function, I create a copy of the listener, so I can't run into a NullPointerException which might happen if the listener is set to null after the != null condition check succeeded. In my case, I believe this is a correct alternative for synchronizing it.
My question is: should I declare here the listener member variable as volatile? I have been reading a lot about volatile, but all examples seem to target the basic data types (boolean, int, ...), and not Objects. So therefore, I am not sure whether Objects should/could be declared volatile as well. I believe I have to declare it as volatile, so the thread always has the latest version of the member variable, but I am not sure.
Thanks!
 
     
    