我有以下代码:
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()
调用期间交错并获取这些调用:
Thread 1 : logger.append(message);
Thread 2 : logger.append(message);
Thread 1 : logger.append(user);
Thread 2 : logger.append(user);
这样好多了:
public synchronized void log(String message, String user) {
logger.append(message);
logger.append(user);
}
您还可以在私有(private)logger
对象上进行同步。
其优点是不允许类的客户端将其锁定在类之外。
关于java - StringBuffer 还是同步方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45763073/