【发布时间】:2015-04-12 04:01:15
【问题描述】:
大家好!
对于 StringBuffer 以何种方式/在何种情况下同步并防止多线程访问,我有点困惑。在下面的代码中,它打印出 for 循环中的字母 A 100 次,然后 B 100 次等...注释掉同步 (sb){} 部分,它不再同步并且不起作用... .
那么 StringBuffer 是如何同步的……它会在什么限制下工作?有人可以简单地解释一下吗?必须是原子操作吗?
谢谢!
约翰。
package threads.sync.ch13;
import java.util.ArrayList;
import java.util.List;
class Ex13_2 extends Thread {
static StringBuffer sb;
// StringBuilder sb;
String s;
public Ex13_2(StringBuffer sb) {
this.sb = sb;
}
public void run() {
synchronized (sb) {
// incr letter then print 100 X
sb.replace(0, sb.length(), this.s);
for (int i = 0; i < 100; i++) {
System.out.print(this.sb);
}
System.out.println();
}
}
public static void main(String[] args) {
// single Class Buffer per Instance...
sb = new StringBuffer("");
// Create Array of Multiple Thread Instances
// and start running them...
List<Ex13_2> e = new ArrayList<>();
for (char c = 'A'; c <= 'D'; c++) {
Ex13_2 t = new Ex13_2(sb);
t.s = c + "";
e.add(t);
}
for (Ex13_2 t : e) {
t.start();
}
}
}
【问题讨论】:
-
BrianT. 的回答涉及到一个非常重要的点。 StringBuilder 被认为是“线程安全的”,因为无论有多少线程尝试同时访问同一个实例,也无论它们对它做什么,它们都不能将实例置于错误状态。但这确实不总是意味着追加将按照您希望它们发生的顺序发生:您可能需要为此进行额外的同步,因为......完全用“线程安全”对象构建程序不会使 program 线程安全。
标签: java multithreading synchronization stringbuffer