StringBuffer 还是同步方法?

StringBuffer or synchronized method?

我有以下代码:

public class MyLogger {
   private StringBuilder logger = new StringBuilder();

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

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

一个。同步日志方法

乙。将 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);
   }

您也可以在私有 logger 对象上进行同步。
其优点是不允许 class 的客户端将其锁定在 class.

之外

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

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