If you mean will there be a runtime exception, the answer is no. The code that iterates over strings will use whatever the reference happens to be when the iterator invokes.
It doesn't matter if the strings reference changes while iterating. Think of it like this,
Iterator<String> i = strings.iterator();
strings = new List<String>();
while (i.hasNext()) {
...
i.next();
}
This code is fine. The object pointed to by strings hasn't changed. We only changed the strings reference to point to somewhere else. The iterator still points to the original object referenced by strings before the assignment.
EDIT: some comments below have said the original example is unsafe publication. I don't believe it is. Unsafe publication is about allowing thread B to access an object under construction in thread A- thread A is unsafely publishing the object to thread B.
However, in the example above, there's no object construction with regard to the fields in question. As far as we know both the lists were fully constructed in a thread-safe manner. There is only reference assignment. Object assignment in Java is atomic From the Java language spec,
"When a thread uses the value of a variable,
the value it obtains is in fact a value stored into the variable by
that thread or by some other thread. This is true even if the program
does not contain code for proper synchronization. For example, if two
threads store references to different objects into the same reference
value, the variable will subsequently contain a reference to one
object or the other, not a reference to some other object or a
corrupted reference value. (There is a special exception for long and
double values; see §17.4.)
Now, there might be unsafe publication in the OP's code if the object passed to updateList()
wasn't constructed safely, but I'm not going to hypothesize what bugs might exist in code I can't see.