字符串缓冲区还是同步方法?



我有以下代码:

public class MyLogger {
private StringBuilder logger = new StringBuilder();
public void log(String message, String user) {
logger.append(message);
logger.append(user);
}
}

程序员必须保证单个 MyLogger 对象可以正常工作 多线程系统。 必须如何更改此代码以使其线程安全?

A. 同步日志方法

B. 将StringBuilder替换为StringBuffer

请告知最佳方法。

StringBuffer

不足以保证这两个信息始终分组发送:

logger.append(message);
logger.append(user);

它仅保证不会以并发方式调用append(),因此您不会冒破坏StringBuffer对象状态的风险。
您确实可以有两个线程在log()调用期间交错并获得这些调用:

线程 1 : logger.append(消息(;

线程 2 : logger.append(消息(;

线程 1 : logger.append(用户(;

线程 2 : logger.append(用户(;

这太好了:

public synchronized void log(String message, String user) {
logger.append(message);
logger.append(user);
}

您还可以对专用logger对象执行同步。
这样做的好处是不允许类的客户端将其锁定在类外部。

使用A,因为如果您选择使用 StringBuffer,您可能会弄乱日志: StringBuffer 可能会发生这种情况(将生成错误的日志(:

logger.append(message); < Thread A
logger.append(message); < Thread B
logger.append(user);  < Thread A
logger.append(user); < Thread B

最新更新