¿Por qué JDK sourcecode toma una copia `final` de las instancias` volatile`

Leí el código fuente de JDK sobre ConcurrentHashMap.

Pero el siguiente código me confundió:

public boolean isEmpty() {
    final Segment<K,V>[] segments = this.segments;
    ...
}

Mi pregunta es:

Se declara "this.segments":

final Segment<K,V>[] segments;

Entonces, aquí, al comienzo del método, declarado una referencia de tipo igual, apunta a la misma memoria.

¿Por qué el autor lo escribió así? ¿Por qué no usaron esto directamente? ¿Hay alguna razón?

Respuestas a la pregunta(3)

Su respuesta a la pregunta