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, StringBuilder
y el StringBuffer
có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 StringBuffer
el más comúnmente utilizado es el append
mé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 AbstractStringBuilder
mé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 StringBuilder
es seguro hilo.
2, el método de agregación de análisis
miramos hacia atrás a AbstractStringBuilder
la append()
quinta línea de enfoque de código ensureCapacityInternal()
es comprobar StringBuilder
el objeto original char
de la capacidad de matriz no puede contener la nueva cadena, si se llama a desbordó el Arrays.copyOf
método para char
la 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.