El uso de una variable local al inicializar una variable estática

John McClane:

En el código fuente de la java.util.Scannerque he encontrado estos métodos de utilidad estáticas:

private static Pattern separatorPattern() {
    Pattern sp = separatorPattern;
    if (sp == null)
        separatorPattern = sp = Pattern.compile(LINE_SEPARATOR_PATTERN);
    return sp;
}

private static Pattern linePattern() {
    Pattern lp = linePattern;
    if (lp == null)
        linePattern = lp = Pattern.compile(LINE_PATTERN);
    return lp;
}

¿Por qué se ha hecho de una manera tan compleja y no sólo, por ejemplo,

private static Pattern linePattern() {
    if (linePattern == null)
        linePattern = Pattern.compile(LINE_PATTERN);
    return linePattern;
}

¿Cuál fue el punto de utilizar una variable local ( lp) aquí? ¿Es una especie de técnica de optimización? O tal precaución contra una modificación concurrente? Pero linePatternno se puede ajustar a nullnuevo ya que este método es el único lugar donde se modifica.

Thilo:

Creo que quieren evitar la lectura del volatilecampo dos veces.

  • una vez para comprobar si se trata de null
  • una vez para la return

En su versión, que sólo

  • una vez que leerlo en una variable local
  • confirman que la variable local no es nulo
  • volver a la variable local

La optimización es el "camino feliz" que ocurre increíblemente más a menudo que el "camino configuración inicial" que sólo ocurre una vez - o como mucho un par de veces si el método se llama al mismo tiempo antes de que haya finalizado la inicialización.

O tal precaución contra una modificación concurrente?

No hay tal precaución. Si llama linePatternal mismo tiempo antes de que haya terminado de configurar el campo volátil estática, el patrón será creado varias veces (pero que está bien), se devolverán diferentes instancias y al azar de los que se elegirá a quedarse (que también está bien, ya son equivalentes).

Cualquier medida para protegerse de las que sólo se añaden costes a nuestro "camino feliz" por lo que sólo debe hacerse en situaciones donde la instancia debe ser realmente un producto único por alguna razón.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=171806&siteId=1
Recomendado
Clasificación