stringbuilder是线程不安全的类。
StringBuffer是线程安全的,因为它里面的方法加了synchronized。
今天写了一段代码测试了一下:用循环开启10个线程,调用StringBuffer(StringBuilder)的append追加1 到 10 。
结果预期一样:线程不安全的StringBuilder会漏掉一些数字,
public static void main(String[] args) throws InterruptedException {
StringBuffer buffer = new StringBuffer();
StringBuilder builder = new StringBuilder(); // 开启十个线程,分别对buffer 和 builder 操作
for(int i = 0; i < 10; i++) {
int j = i;
new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(500); //造成阻塞
} catch (InterruptedException e) {
e.printStackTrace();
}
builder.append(j);
}
}).start();
} //等待以上操作完成
Thread.sleep(1000); // 打印结果
System.out.println("builder:"+builder);
}
线程安全的StringBuffer则追加了全部10个数字:
功能列表:底层程序与前台页面分离的效果,对页面的修改无需改动任何程序代码。完善的标签系统,支持自定义标签,公用标签,快捷标签,动态标签,静态标签等等,支持标签内的vbs语法,原则上运用这些标签可以制作出任何想要的页面效果。兼容原来的栏目系统,可以很方便的插入一个栏目或者一个栏目组到页面的任何位置。底层模版解析程序具有非常高的效率,稳定性和容错性,即使模版中有错误的标签也不会影响页面的显示。所有的标
public static void main(String[] args) throws InterruptedException {
StringBuffer buffer = new StringBuffer();
StringBuilder builder = new StringBuilder(); // 开启十个线程,分别对buffer 和 builder 操作
for(int i = 0; i < 10; i++) {
int j = i;
new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(500); //造成阻塞
} catch (InterruptedException e) {
e.printStackTrace();
}
buffer.append(j);
}
}).start();
} //等待以上操作完成
Thread.sleep(1000); // 打印结果
System.out.println("buffer:"+buffer);
}
这时:如果我同时操作builder和buffer,且先调用buffer的append,这时每次操作因为builder和buffer在同一个线程,builder的方法因为buffer阻塞了线程而被变成“同步”的方法,同样append了10个数字
public static void main(String[] args) throws InterruptedException {
StringBuffer buffer = new StringBuffer();
StringBuilder builder = new StringBuilder(); // 开启十个线程,分别对buffer 和 builder 操作
for(int i = 0; i < 10; i++) {
int j = i;
new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(500); //造成阻塞
} catch (InterruptedException e) {
e.printStackTrace();
}
buffer.append(j);
builder.append(j);
}
}).start();
} //等待以上操作完成
Thread.sleep(1000); // 打印结果
System.out.println("buffer:"+buffer);
System.out.println("builder:"+builder);
}








