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());
}
}
分享到:
相关推荐
在Java编程语言中,String、StringBuilder和StringBuffer都是用来处理字符串的类,它们之间存在一些重要的区别,主要涉及到性能和线程安全性。 首先,`String`类代表的是字符串常量,一旦创建,其内容就不能改变。...
StringBuffer是StringBuilder的线程安全版本,它提供了与StringBuilder相同的API,但是它是线程安全的。这意味着StringBuffer可以在多线程环境中使用,但是它的效率比StringBuilder要低。 StringBuilder和...
其次,从线程安全性方面来说,StringBuilder 是线程非安全的,而 StringBuffer 是线程安全的。这是因为 StringBuilder 不提供同步机制,使得在多线程下操作时可能会出现问题,而 StringBuffer 提供了同步机制,保证...
StringBuffer类是线程安全的,而StringBuilder类不是线程安全的。 在选择字符串类时,我们需要考虑到线程安全性和执行效率。如果需要线程安全性,可以选择StringBuffer类;如果需要高执行效率,可以选择...
`StringBuilder`是`StringBuffer`的非线程安全版本,它在单线程环境下性能更优。其功能与`StringBuffer`相同,但在多线程环境下的安全性不足。例如: ```java StringBuilder sb = new StringBuilder("Hello"); sb....
String, StringBuffer 与 StringBuilder 的区别 ...String 是不可变类,StringBuffer 是可变类,而 StringBuilder 是线程不安全的可变类。根据不同的使用场景,我们可以选择合适的类来实现字符操作。
`StringBuilder`和`StringBuffer`的主要区别在于线程安全性。`StringBuilder`没有采取任何同步措施,因此在多线程环境下可能会出现数据不一致的问题。而在`StringBuffer`中,每个修改字符串的操作(如`append()`)都...
在这之前我只记住了StringBuilder不是线程安全的,StringBuffer是线程安全的这个结论,至于StringBuilder为什么不安全从来没有去想过。 分析 在分析这个问题之前我们要知道StringBuilder和StringBuffer的内部实现跟S
StringBuffer 是线程安全的,而 StringBuilder 则不是。因此,在多线程环境下,使用 StringBuffer 可以确保线程安全,而 StringBuilder 则需要额外的同步机制来确保线程安全。 应用场景 * 使用 String 类型:在...
`StringBuilder`是`JDK 5.0`引入的新类,它是`StringBuffer`的一个轻量级替代品,主要区别在于`StringBuilder`不是线程安全的。这意味着在单线程环境下,`StringBuilder`的操作速度通常会比`StringBuffer`更快,因为...
StringBuilder在单线程环境下使用,而StringBuffer是在多线程环境中使用,因为StringBuffer提供了同步方法,保证了线程安全。 关于线程安全性,String由于其不可变性自然具备线程安全性,不同线程读取同一个String...
其中,StringBuilder是Java 5引入的新类,它与StringBuffer功能类似,但不保证线程安全。这意味着在单线程环境下,StringBuilder通常比StringBuffer更快,因为它省去了同步开销。 StringBuffer是在多线程环境下使用...
相比之下,`StringBuilder`和`StringBuffer`类提供了可变的字符串。它们都包含一个可变的`char`数组`value`,允许通过`append()`等方法直接修改字符串内容,而无需创建新的对象。`StringBuilder`是在Java 5中引入的...
浅谈Java StringBuilder为什么线程不安全 Java StringBuilder是一个可变的字符串对象,它可以动态地增加或删除字符,然而,它却不是线程安全的。在多线程环境下,使用StringBuilder可能会出现一些问题,例如输出值...
- **概念**:StringBuilder是Java中用于动态构建字符串的类,与StringBuffer类似,但非线程安全。在单线程环境中,StringBuilder通常比StringBuffer更快,因为它没有进行线程同步的开销。 - **基本操作**:`append...
**四、为什么StringBuffer和StringBuilder更适合在循环中使用?** 因为 `String` 对象是不可变的,每次修改 `String` 都会创建一个新的对象。在循环中大量使用 `String` 进行拼接会导致频繁的对象创建和销毁,消耗...
在大多数应用中,由于线程安全不是普遍需求,StringBuilder通常被视为首选。 使用StringBuilder的例子如下: ```java StringBuilder sb = new StringBuilder("hello jack"); sb.insert(2, 5); System.out.println...
而`StringBuilder`类在JDK 1.5引入,它没有进行线程安全的同步,因此在单线程环境中,`StringBuilder`的性能优于`StringBuffer`,因为它避免了不必要的同步开销。 在选择使用`StringBuffer`还是`StringBuilder`时,...