In the following code snippet, why is it desirable to return a copy of data[i]. What exactly happen in a multi-threaded environment if copy is not made.
protected Object[] data;
..
public synchronized Object get(int i)
throws NoSuchElementException
{ if (i < 0 || i >= size )
throw new NoSuchElementException();
return data[i];
}
You’re returning a copy of the reference at index
i, not a copy of the object.Unless you create a copy of the object through for instance
data[i].clone(), you’ll always have a single object and share references to it among your threads. There is nothing wrong with sharing references to a single object among several threads.Well, unless you synchronize your threads using the synchronized methods, wait/notify or the
java.util.concurrent-classes you may end up with race-conditions. A race condition is basically a situation where the result of the execution is dependent on the particular scheduling (the order in which the threads may execute).If you share objects of a certain class among threads, you should design it to be “thread safe”. If your object represents a value object I recommend you to make it immutable.