我有以下代码:
public class MyLogger {
private StringBuilder logger = new StringBuilder();
public void log(String message, String user) {
logger.append(message);
logger.append(user);
}
}
程序员必须保证单个MyLogger对象可以正常工作 多线程系统。 如何将此代码更改为线程安全的?
一个。同步日志方法
B中。将StringBuilder
替换为StringBuffer
请告知最佳方法。
答案 0 :(得分:3)
StringBuffer
不足以保证两个信息始终分组发送:
logger.append(message);
logger.append(user);
它仅保证append()
不会以并发方式调用,因此您不会冒险破坏StringBuffer
对象的状态。
在log()
调用期间,您确实可以有两个交错的线程并获取这些调用:
线程1:logger.append(message);
线程2:logger.append(message);
线程1:logger.append(user);
线程2:logger.append(user);
这样做更好:
public synchronized void log(String message, String user) {
logger.append(message);
logger.append(user);
}
您还可以在私人logger
对象上执行同步
这样做的好处是不允许班级的客户将其锁定在课堂外。
答案 1 :(得分:0)
使用A,因为如果您选择使用StringBuffer,您可能会弄乱日志: 这可能发生在StringBuffer上(会生成错误的日志):
logger.append(message); < Thread A
logger.append(message); < Thread B
logger.append(user); < Thread A
logger.append(user); < Thread B