`
xiang37
  • 浏览: 429470 次
  • 性别: 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一样了。

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

相关推荐

    String、StringBuilder和StringBuffer的区别

    在Java编程语言中,String、StringBuilder和StringBuffer都是用来处理字符串的类,它们之间存在一些重要的区别,主要涉及到性能和线程安全性。 首先,`String`类代表的是字符串常量,一旦创建,其内容就不能改变。...

    从源码角度简单看StringBuilder和StringBuffer的异同(全面解析)

    StringBuffer是StringBuilder的线程安全版本,它提供了与StringBuilder相同的API,但是它是线程安全的。这意味着StringBuffer可以在多线程环境中使用,但是它的效率比StringBuilder要低。 StringBuilder和...

    String、StringBuilder、StringBuffer的区别

    其次,从线程安全性方面来说,StringBuilder 是线程非安全的,而 StringBuffer 是线程安全的。这是因为 StringBuilder 不提供同步机制,使得在多线程下操作时可能会出现问题,而 StringBuffer 提供了同步机制,保证...

    String StringBuffer和StringBuilder区别之源码解析

    StringBuffer类是线程安全的,而StringBuilder类不是线程安全的。 在选择字符串类时,我们需要考虑到线程安全性和执行效率。如果需要线程安全性,可以选择StringBuffer类;如果需要高执行效率,可以选择...

    String、StringBuffer、StringBuilder的使用方法

    `StringBuilder`是`StringBuffer`的非线程安全版本,它在单线程环境下性能更优。其功能与`StringBuffer`相同,但在多线程环境下的安全性不足。例如: ```java StringBuilder sb = new StringBuilder("Hello"); sb....

    String ,StringBuffer与StringBuilder

    String, StringBuffer 与 StringBuilder 的区别 ...String 是不可变类,StringBuffer 是可变类,而 StringBuilder 是线程不安全的可变类。根据不同的使用场景,我们可以选择合适的类来实现字符操作。

    Java StringBuilder和StringBuffer源码分析

    `StringBuilder`和`StringBuffer`的主要区别在于线程安全性。`StringBuilder`没有采取任何同步措施,因此在多线程环境下可能会出现数据不一致的问题。而在`StringBuffer`中,每个修改字符串的操作(如`append()`)都...

    StringBuilder为什么线程不安全?

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

    String及StringBuffer和StringBuilder的区别

    StringBuffer 是线程安全的,而 StringBuilder 则不是。因此,在多线程环境下,使用 StringBuffer 可以确保线程安全,而 StringBuilder 则需要额外的同步机制来确保线程安全。 应用场景 * 使用 String 类型:在...

    String-StringBuffer-StringBuilder

    `StringBuilder`是`JDK 5.0`引入的新类,它是`StringBuffer`的一个轻量级替代品,主要区别在于`StringBuilder`不是线程安全的。这意味着在单线程环境下,`StringBuilder`的操作速度通常会比`StringBuffer`更快,因为...

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

    StringBuilder在单线程环境下使用,而StringBuffer是在多线程环境中使用,因为StringBuffer提供了同步方法,保证了线程安全。 关于线程安全性,String由于其不可变性自然具备线程安全性,不同线程读取同一个String...

    Java 中String StringBuilder 与 StringBuffer详解及用法实例

    其中,StringBuilder是Java 5引入的新类,它与StringBuffer功能类似,但不保证线程安全。这意味着在单线程环境下,StringBuilder通常比StringBuffer更快,因为它省去了同步开销。 StringBuffer是在多线程环境下使用...

    String和StringBuilder、StringBuffer的区别1

    相比之下,`StringBuilder`和`StringBuffer`类提供了可变的字符串。它们都包含一个可变的`char`数组`value`,允许通过`append()`等方法直接修改字符串内容,而无需创建新的对象。`StringBuilder`是在Java 5中引入的...

    浅谈Java StringBuilder为什么线程不安全

    浅谈Java StringBuilder为什么线程不安全 Java StringBuilder是一个可变的字符串对象,它可以动态地增加或删除字符,然而,它却不是线程安全的。在多线程环境下,使用StringBuilder可能会出现一些问题,例如输出值...

    应用线程并通过BuilderString产生字符

    - **概念**:StringBuilder是Java中用于动态构建字符串的类,与StringBuffer类似,但非线程安全。在单线程环境中,StringBuilder通常比StringBuffer更快,因为它没有进行线程同步的开销。 - **基本操作**:`append...

    Java StringBuffer & StringBuilder.pdf

    **四、为什么StringBuffer和StringBuilder更适合在循环中使用?** 因为 `String` 对象是不可变的,每次修改 `String` 都会创建一个新的对象。在循环中大量使用 `String` 进行拼接会导致频繁的对象创建和销毁,消耗...

    StringBuffer 和 StringBuilder 类

    在大多数应用中,由于线程安全不是普遍需求,StringBuilder通常被视为首选。 使用StringBuilder的例子如下: ```java StringBuilder sb = new StringBuilder("hello jack"); sb.insert(2, 5); System.out.println...

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

    而`StringBuilder`类在JDK 1.5引入,它没有进行线程安全的同步,因此在单线程环境中,`StringBuilder`的性能优于`StringBuffer`,因为它避免了不必要的同步开销。 在选择使用`StringBuffer`还是`StringBuilder`时,...

Global site tag (gtag.js) - Google Analytics