`
bjlf1105
  • 浏览: 24775 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

线程安全的StringBuffer和线程不安全的StringBuilder

阅读更多
有一个线程:
public class MyThread extends Thread {
private StringBuffer sb;
public MyThread(String name,StringBuffer sb) {
super(name);
this.sb = sb;
}
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
sb.append("abc");
}
}
}
测试类:
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
MyThread mt = new MyThread("我的线程",sb);
mt.start();

for (int i = 0; i < 10000; i++) {
sb.append("abcd");
}
while(mt.isAlive()){
}
System.out.println(sb.length());
}
因为StringBuffer是线程安全的,因此每次甚至无论你打印sb的长度多少次,他的值始终是一样的,也就好似有70000个字符长度,但是你把StringBuffer改成StringBuilder,那么每次的打印结果就不一定,甚至可能抛出越界的异常。
再比如把他改为HashTable和HashMap,同样的测试方法,发现Hashtable是线程安全的,而HashMap是线程不安全的,因此hashmap每次打印的结果应该不太一样。
这扯远点,如何编写线程安全的代码呢?Servlet是单实力多线程的,因此他必须是同步且安全的,这样就要注意他的成员变量了,而Struts2则是根据每次请求而创建Action,不存在所谓的安全问题,从而得到很好的扩展
分享到:
评论

相关推荐

    StringBuffer 和 StringBuilder 类

      StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议...

    StringBuilder为什么线程不安全?

    面试官:那StringBuilder不安全的点在哪儿? 我:。。。(哑巴了) 在这之前我只记住了StringBuilder不是线程安全的,StringBuffer是线程安全的这个结论,至于StringBuilder为什么不安全从来没有去想过。 分析 在...

    Java StringBuffer & StringBuilder.pdf

    StringBuffer和StringBuilder类的用法基本相同,但StringBuilder类的效率更高,因为它不是线程安全的; 二、StringBuffer的示例 // 创建一个空的StringBuffer对象 StringBuffer sb = new StringBuffer(); // 向...

    你知道String、StringBuffer和StringBuilder的区别吗

    目录StringStringBuffer与StringBuilder总结 String 官方解释: String类是不可变类,即一旦一个...这两者基本相似,都是可变字符串对象,主要区别为线程是否安全。 总结 最后,引用菜鸟教程下的总结以及相关评论: S

    Android 中StringBuffer 和StringBuilder常用方法

    StringBuilder不支持并发操作,线性不安全的,不适合多线程中使用。新引入的StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高。 StringBuffer常用方法 (由于StringBuffer和StringBuilder在...

    Java-String&StringBuilder&StringBuffer的区别与分析

    我们先用一张表格来回顾一下Java中String,StringBuilder,StringBuffer关于值可变性、线程安全性、时间性能排序、常用场景等主要区别。见下表: 数据类型 值可变性 线程安全性 时间性能排名 常用场景 String...

    Java 中操作字符串都有哪些类?它们之间有什么区别?

    StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程...

    java面试问题总结

    当我们的字符串缓冲区被多个线程使用时,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer的正确操作。当然大多数情况下是我们是在单线程下进行的操作,所以大多建议用...

    Java String StringBuilder StringBuffer

    在Android/Java开发中,...  3) StringBuffer 是线程安全的, StringBuilder 不是线程安全的。  String VS StringBuffer  String 类型和StringBuffer的主要性能区别:String是不可变的对象, 因此在每次对String

    JavaSE 笔试 精华

    StringBuffer是线程安全的,StringBuilder不是线程安全的。 2、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口) 答:匿名的内部类是没有名字的内部类。...

    第5讲 String、StringBuffer、StringBuilder有什么区别1

    StringBuffer 本质是一个线程安全的可修改字符序列,它保证了线程安全,也随之带来了额外的性能开销,所以除非有线程安全的需要,不然还是推荐使用它的后继者

    Java基础面试题 91道面试复习八股文

    88. String和StringBuffer、StringBuilder的区别是什么?String为什么是不可 变的 可变性 String类中使用字符数组保存字符串,private final char value[],所以string对象是不可变 的。StringBuilder与...

    StringBuilder拼接字符串

    C# StringBuilder 拼接字符串 字符串转换工具 StringBuilder比StringBuffer运行速度要快,因为StringBuilder是针对于单线程的,所这它是非线程安全的。普通情况下建议使用StringBuilder。

    Java—StringBuffer和StringBuilder

    Concept ...StringBuffer是为了解决大量拼接字符串时产生很多中间对象问题而提供的类,他是一个线程安全的可变字符序列,类似于字符串,但是可以修改。 StringBuilder作为JDK 5 发布后对StringBuff

    java--面试题大全(附答案

    String和StringBuilder、...StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高。

    Java中String、StringBuffer、StringBuilder的区别介绍

    主要介绍了Java中String、StringBuffer、StringBuilder的区别介绍,本文讲解了可变与不可变、是否多线程安全、gBuilder与StringBuffer共同点等内容,需要的朋友可以参考下

    Java String 类.pdf

    一、什么是Java中的String类? String类是Java中表示字符串的类。它是不可变的,一旦创建了一个字符串对象,就无法修改它。 二、String类和StringBuilder...StringBuffer是线程安全的,因为它的所有公共方法都是同步的

    全面解释java中StringBuilder、StringBuffer、String类之间的关系

    String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间,StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新...

    Java中StringBuilder在高性能用法总结

    StringBuilder不是线程安全的,为了“安全”起见好还是用StringBuffer;  3. 永远不要自己拼接日志信息的字符串,交给slf4j来。  1. 初始长度好重要,值得说四次。  StringBuilder的内部有一个char[], 不断...

Global site tag (gtag.js) - Google Analytics