gpt4 book ai didi

java - StringBuffer同步是如何工作的?

转载 作者:行者123 更新时间:2023-12-01 22:27:33 25 4
gpt4 key购买 nike

向大家问好!

我有点困惑 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();
}

}

}

最佳答案

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

返回 StringBuffer。它的所有公共(public)方法都是同步的,因此它在内部是“安全的”。但以下内容不是原子的:

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

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

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

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

关于java - StringBuffer同步是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28460170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com