0

我想知道 StringBuilder 和 StringBuffer 类及其实际用途之间的区别。因此,我编写了 2 个代码片段,其中我同时生成了 3 个线程,这些线程使用了 StringBuilder 和 StringBuffer 对象。

当我运行代码时,我希望所有 3 个线程在 StringBuilder 的情况下同时运行,在 StringBuffer 的情况下以同步的方式运行。但在这两种情况下,它们都以同步方式运行。那么StringBuffer类有什么用呢?:confused:

(对于 String 对象,所有 3 个线程同时运行)。我将分享代码片段供您参考。如果我对多线程本身的概念理解有误,也请纠正我。请同时更正代码。

// StringBuilder...

public class MultiTread implements Runnable{
private StringBuilder name;
public MultiTread(StringBuilder string){
name=string;
}

public void run(){
for(int i=0; i<=10; i++){
System.out.println(name.append(i));
}
}
public static void main(String[] args){
Thread th = new Thread(new MultiTread(new StringBuilder("thread1:")));
Thread th1 = new Thread(new MultiTread(new StringBuilder("thread2:")));
Thread th2 = new Thread(new MultiTread(new StringBuilder("thread3:")));

th.start();
th1.start();
th2.start();
}
}

..................

//StringBuffer...

public class MultiTreadBuf implements Runnable{
private StringBuffer name;
public MultiTreadBuf(StringBuffer string){
name=string;
}

public void run(){
for(int i=0; i<=10; i++){
System.out.println(name.append(i));
}
}
public static void main(String[] args){
Thread th = new Thread(new MultiTreadBuf(new StringBuffer("thread1:")));
Thread th1 = new Thread(new MultiTreadBuf(new StringBuffer("thread2:")));
Thread th2 = new Thread(new MultiTreadBuf(new StringBuffer("thread3:")));

th.start();
th1.start();
th2.start();
}
}

........

//String....

public class MuiltiTreadStr implements Runnable{
private String name;
public MuiltiTreadStr(String string){
name=string;
}

public void run(){
for(int i=0; i<=10; i++){
System.out.println(name+i);
}
}
public static void main(String[] args){
System.out.println("main begins...");
Thread th = new Thread(new MuiltiTreadStr("thread1:"));
Thread th1 = new Thread(new MuiltiTreadStr("thread2:"));
Thread th2 = new Thread(new MuiltiTreadStr("thread3:"));
System.out.println("spawning 3 threads...");
th.start();
th1.start();
th2.start();
System.out.println("main ends...");
}
} 
4

3 回答 3

8

您正在为每个线程使用不同的 StringBuffers 和 StringBuilders 实例。要查看同步,您必须在所有线程中使用相同的对象实例;-)

于 2013-10-09T06:27:19.067 回答
2

对预期与实际行为的描述会有所帮助,但我猜您看到了每个线程的顺序输出,但预计会看到来自不同线程的交错输出。

线程调度取决于系统。无法保证线程将被公平调度(例如,具有相同优先级的线程获得“时间片”),或者线程将并发运行,即使在多处理器系统上也是如此。

另外,请记住这System.out.println()是同步的,并且不能保证公平或立即解决对内在锁的争用。所以有可能一个线程重复获取锁System.out,而其他线程在该线程完成之前没有机会打印。您可以使用java.util.concurrent.ReentrantLock.

另一种可能性是您的系统太快了,以至于一个线程在下一个线程甚至尝试开始运行之前就完成了。更多的迭代将有助于检测这种情况。

于 2013-10-09T06:38:30.267 回答
0

您应该为所有线程使用相同的 StringBuilder/StingBuffer 实例。这样您就可以看到同步。

于 2013-10-09T06:30:38.913 回答