JAVA常用API (应用程序编程接口)
java.long.String(StringBuilder线程不安全,StringBuffer线程安全)
分析
其中StringBuilder和StringBuffer同String一样都是由char数组来存储字符串的;不同的是String 是final修饰的是不可变的,而StringBuilder和StringBuffer的char数组是可变的。
现在让我们来看看StringBuilder,为什么说它是线程不安全呢?
原因在于StringBuffer在append()方法上使用了synchronized,而StringBuilder没有使用。
StringBuilder一般在单线程操作字符串缓冲区下操作大量数据 。
StringBuilder在多线程操作中会出现什么样的问题呢?
以下面这段代码为例:
package itheima;
public class StringBuilderDemo {
public static void main(String[] args) throws InterruptedException {
StringBuilder stringBuilder = new StringBuilder();//创建StringBuilder对象
for (int i = 0; i < 10; i++){
new Thread(new Runnable() {//新建线程
public void run() {//调用线程
for (int j = 0; j < 10000; j++){//将每个线程循环10000次
stringBuilder.append("abc");
}
}
}).start();//线程启动
}
Thread.sleep(100);//让当前线程休眠100毫秒
System.out.println(stringBuilder.length());//
}
}
以上这段代码创建了10个线程,每个线程循环10000次往StringBuilder对象里面append"abc"字符。在正常情况下运行这段代码应该输出300000。
下面来看看我们运行的结果:
上面我们分析了正常的输出应该是300000,而我们的结果是273459,运行结果可以表明StringBuilder不适合多线程的操作,不能安全使用多线程。 如果需要同步,那么还是建议使用StringBuffer 。
除非另有说明,否则将null参数传递给null中的构造函数或方法将导致抛NullPointerException。