Colecciones de Java Serie Cinco: StringBuilder Por qué no seguro para subprocesos?

introducción

De hecho StringBuilder no pertenece al conjunto, pero a fin de no nuevas series de artículos abiertos, esta serie de artículos escritos en el interior. Estamos en el proceso de la entrevista, el entrevistador veces señalan cuestiones basadas en Java estables tales como las cuestiones relacionadas con HashMap y así sucesivamente. Todos sabemos que StringBuilder no es seguro para subprocesos, por lo que si el proceso de la entrevista, el entrevistador continuar a preguntar por qué no es hilo de seguridad, muchas personas están atrapadas en este tema.

  • análisis de código fuente
  • resumen

En primer lugar, el código fuente análisis

1, el método de análisis append
muestra a continuación, StringBuildery el StringBuffercódigo fuente es el siguiente, que han heredado AbstractStringBuilder:

public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
{
...
}
 public final class StringBuffer
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
{
...
}

variables miembro de la clase padre utilizados son los siguientes:

//存储字符串的数据
char[] value;
//已经使用的字符数组数量
int count;

Lo uso StringBuilder, así como StringBufferel más comúnmente utilizado es el appendmétodo, como sigue:

//可以追加任意对象
@Override
public StringBuilder append(Object obj) {
        return append(String.valueOf(obj));
    }
//可以追加字符串
@Override
public StringBuilder append(String str) {
        super.append(str);
        return this;
    }

En realidad se llama a la clase de los padres AbstractStringBuildermétodo append. De la siguiente manera:

 public AbstractStringBuilder append(String str) {
        if (str == null)
            return appendNull();
        int len = str.length();
        ensureCapacityInternal(count + len);
        str.getChars(0, len, value, count);
        //变量数据更新
        count += len;
        return this;
    }

Como puede verse en el código anterior count += len;no es una operación atómica. En este valor de recuento es 10 por ejemplo, len es 1, dos hilos a la vez ejecutar la séptima fila, para obtener los valores de recuento son 10, después de ejecutarse el resultado asignación de la adición a la cuenta, por lo que la aplicación de los dos últimos hilos Un valor de conteo de 11, en lugar de 12. Así que StringBuilderes seguro hilo.

2, el método de agregación de análisis
miramos hacia atrás a AbstractStringBuilderla append()quinta línea de enfoque de código ensureCapacityInternal()es comprobar StringBuilderel objeto original charde la capacidad de matriz no puede contener la nueva cadena, si se llama a desbordó el Arrays.copyOfmétodo para charla expansión del array.

 private void ensureCapacityInternal(int minimumCapacity) {
        // overflow-conscious code
        if (minimumCapacity - value.length > 0) {
            value = Arrays.copyOf(value,
                    newCapacity(minimumCapacity));
        }
    }
 public static char[] copyOf(char[] original, int newLength) {
        char[] copy = new char[newLength];
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }
public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) {
        if (srcBegin < 0) {
            throw new StringIndexOutOfBoundsException(srcBegin);
        }
        if (srcEnd > value.length) {
            throw new StringIndexOutOfBoundsException(srcEnd);
        }
        if (srcBegin > srcEnd) {
            throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);
        }
        System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin);
    }

En segundo lugar, el resumen

Algunos hilos de operación insegura existe código fuente del JDK, de hecho, porque no hay funcionamiento síncrono correspondiente a asegurar que las operaciones atómicas. Así que puede ser analizado por esto, y puede ser adecuadamente optimizada y mejorada.

Publicado 88 artículos originales · ganado elogios 49 · Vistas de 100.000 +

Supongo que te gusta

Origin blog.csdn.net/Diamond_Tao/article/details/102129598
Recomendado
Clasificación