【问题标题】:How does StringBuffer synchronization work?StringBuffer 同步如何工作?
【发布时间】: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


【解决方案1】:

首先,对于非共享使用,StringBuilder 更胜一筹(它是为此目的而编写的……它完全不同步,因此速度更快)。

返回字符串缓冲区。它的所有公共方法都是同步的,因此它在内部是“安全的”。但以下不是原子的:

StringBuffer sb = //get_sb_from_somewhere;
sb.append("foo").append("bar);

要使附加完全线程安全,请将它们包装在锁中,使用对象将使用的相同锁。通常这只是对象,就像这里的情况一样,所以:

synchronized (sb) {
  sb.append("foo").append("bar);
}

你的 run() 方法对我来说看起来不错。

【讨论】:

    【解决方案2】:

    StringBuilder 中的每个方法都是线程安全的。但是您正在按顺序调用各种方法。因此,对方法的每次调用都是互斥的,但不是整个调用系列。

    通过将整个系列放入 synchronized(sb) {} 块中,您可以使整个系列的调用互斥。

    【讨论】:

      猜你喜欢
      • 2016-09-10
      • 2019-08-31
      • 2018-01-27
      • 2018-03-04
      • 2011-10-27
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多