引用来自“方武卓”的评论
线程安全不安全简单来说可以从两个方面来看:
1)是否会因为多线程造成不符合预期的结果;
2)是否会出现多个线程同时操作同一份数据导致ConcurrentModificationException;
举个例子的话,你之前的例子过于简单了,可以这样来看:
sb = new StringBuilder() / new StringBuffer();
new Thread() { //A
public void run() {
int i = 0;
while (i++ < 10) {
sb.append("aaaaa");
System.out.println(sb);
}
}
}.start();
new Thread() { //B
public void run() {
int i = 0;
while (i++ < 10) {
sb.append("bbbbb");
System.out.println(sb);
}
}
}.start();
A和B同时不停执行上述操作。
如果是StringBuffer的话,可以保证str的结果肯定是5个a加5b,满足这样的正则表达式((a{5})(b{5})*,且输出结果sb一直都是逐渐+5增长的。而如果是StringBuilder的话,就不能保证了,比如有可能看到输出结果一会sb长度已经有40,结果下一个突然又变成了只有10,而且后面的输出结果有可能中间出现空字符,这都是因为多线程不安全,导致操作StringBuilder内部的长度和字符数组时出现竞争换乱了。