我有以下代码:
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