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

StringBuilder与StringBuffer相比为什么不是线程安全的

阅读更多

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()); 
	}
}
分享到:
评论
1 楼 QQ371496669 2012-09-20  
能否具体讲解一下为什么StringBuilder的长度会不一样。

如果在StringBuilder里把append这块用synchronized (sBuilder) 包围起来,main线程也一样

那么,执行结果就和StringBuffer一样了。

请问大虾能否解释一下我的疑问呢?

相关推荐

    StringBuilder为什么线程不安全?

    在这之前我只记住了StringBuilder不是线程安全的,StringBuffer是线程安全的这个结论,至于StringBuilder为什么不安全从来没有去想过。 分析 在分析这个问题之前我们要知道StringBuilder和StringBuffer的内部实现跟S

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

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

    StringBuffer 和 StringBuilder 类

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

    Java StringBuffer & StringBuilder.pdf

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

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

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

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

    String为什么是不可 变的 可变性 String类中使用字符数组保存字符串,private final char value[],所以string对象是不可变 的。StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在...

    Android 中StringBuffer 和StringBuilder常用方法

    如果我们的程序是在单线程下运行,或者是不必考虑到线程...新引入的StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高。 StringBuffer常用方法 (由于StringBuffer和StringBuilder在使用上几乎一

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

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

    StringBuilder拼接字符串

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

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

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

    Java String StringBuilder StringBuffer

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

    java面试问题总结

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

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

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

    JavaSE 笔试 精华

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

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

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

    java三种字符串处理差别

    java字符串三种处理方式区别String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全)

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

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

    Java中StringBuilder在高性能用法总结

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

    Java—StringBuffer和StringBuilder

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

Global site tag (gtag.js) - Google Analytics