为什么StringBuilder访问似乎是同步的?

时间:2013-10-09 06:22:32

标签: java multithreading

我想知道StringBuilder和amp;之间的区别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...");
}
} 

3 个答案:

答案 0 :(得分:8)

每个线程使用不同的String Buffer和String Builders实例。要查看同步,必须在所有线程中使用相同的对象实例; - )

答案 1 :(得分:2)

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

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

此外,请记住System.out.println()已同步,并且无法保证公平锁定的争用或公平解决。因此,一个线程可能会重复获取System.out上的锁定,而其他线程在该线程完成之前无法打印。您可以使用java.util.concurrent.ReentrantLock来获得“公平”锁定(可能会造成性能损失)。

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

答案 2 :(得分:0)

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