StringBuilder线程不安全的例子
package com.xiva.demo;
public class StringBuilderDemo extends Thread {
private StringBuilder sb;
public StringBuilderDemo(String name,StringBuilder sb) {
super(name);
this.sb = sb;
}
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
sb.append("abc");
// System.out.println(Thread.currentThread().getName()+sb.toString());
}
}
public static void main(String[] args) {
StringBuilder sBuilder = new StringBuilder();
StringBuilderDemo mt = new StringBuilderDemo("sBuilder线程",sBuilder);
// new Thread(mt).start();
mt.start();
for (int i = 0; i < 10000; i++) {
sBuilder.append("abcd");
}
System.out.println("main"+sBuilder.length());
// System.out.println("main"+sBuilder.toString());
}
}
main所打印出的sBuilder的长度不定,也就是说mt线程执行的时候,main函数对sBuilder仍在影响,而下面的例子中,所打印出的(线程是安全的)长度是一定的!
package com.xiva.demo;
public class StringBufferDemo extends Thread {
private StringBuffer sBuffer;
public StringBufferDemo(String name,StringBuffer sb) {
super(name);
this.sBuffer = sb;
}
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
sBuffer.append("abc");
// System.out.println(Thread.currentThread().getName()+sb.toString());
}
}
public static void main(String[] args) {
StringBuffer sBuffer = new StringBuffer();
StringBufferDemo mt = new StringBufferDemo("sBuffer线程",sBuffer);
mt.start();
// new Thread(mt).start();
// new Thread(mt).start();
for (int i = 0; i < 10000; i++) {
sBuffer.append("abcd");
}
while(mt.isAlive()){
}
System.out.println(sBuffer.length());
}
}
分享到:
相关推荐
在这之前我只记住了StringBuilder不是线程安全的,StringBuffer是线程安全的这个结论,至于StringBuilder为什么不安全从来没有去想过。 分析 在分析这个问题之前我们要知道StringBuilder和StringBuffer的内部实现跟S
我们先用一张表格来回顾一下Java中String,StringBuilder,StringBuffer关于值可变性、线程安全性、时间性能排序、常用场景等主要区别。见下表: 数据类型 值可变性 线程安全性 时间性能排名 常用场景 String...
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议...
StringBuffer和StringBuilder类的用法基本相同,但StringBuilder类的效率更高,因为它不是线程安全的; 二、StringBuffer的示例 // 创建一个空的StringBuffer对象 StringBuffer sb = new StringBuffer(); // 向...
目录StringStringBuffer与StringBuilder总结 String 官方解释: String类是不可变类,即一旦一个...这两者基本相似,都是可变字符串对象,主要区别为线程是否安全。 总结 最后,引用菜鸟教程下的总结以及相关评论: S
String为什么是不可 变的 可变性 String类中使用字符数组保存字符串,private final char value[],所以string对象是不可变 的。StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在...
如果我们的程序是在单线程下运行,或者是不必考虑到线程...新引入的StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高。 StringBuffer常用方法 (由于StringBuffer和StringBuilder在使用上几乎一
StringBuffer 本质是一个线程安全的可修改字符序列,它保证了线程安全,也随之带来了额外的性能开销,所以除非有线程安全的需要,不然还是推荐使用它的后继者
C# StringBuilder 拼接字符串 字符串转换工具 StringBuilder比StringBuffer运行速度要快,因为StringBuilder是针对于单线程的,所这它是非线程安全的。普通情况下建议使用StringBuilder。
StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程...
在Android/Java开发中,... 3) StringBuffer 是线程安全的, StringBuilder 不是线程安全的。 String VS StringBuffer String 类型和StringBuffer的主要性能区别:String是不可变的对象, 因此在每次对String
当我们的字符串缓冲区被多个线程使用时,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer的正确操作。当然大多数情况下是我们是在单线程下进行的操作,所以大多建议用...
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间,StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新...
StringBuffer是线程安全的,StringBuilder不是线程安全的。 2、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口) 答:匿名的内部类是没有名字的内部类。...
String和StringBuilder、...StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高。
java字符串三种处理方式区别String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全)
主要介绍了Java中String、StringBuffer、StringBuilder的区别介绍,本文讲解了可变与不可变、是否多线程安全、gBuilder与StringBuffer共同点等内容,需要的朋友可以参考下
StringBuilder不是线程安全的,为了“安全”起见好还是用StringBuffer; 3. 永远不要自己拼接日志信息的字符串,交给slf4j来。 1. 初始长度好重要,值得说四次。 StringBuilder的内部有一个char[], 不断...
Concept ...StringBuffer是为了解决大量拼接字符串时产生很多中间对象问题而提供的类,他是一个线程安全的可变字符序列,类似于字符串,但是可以修改。 StringBuilder作为JDK 5 发布后对StringBuff