StringBuffer或同步方法?

时间:2017-08-18 18:37:30

标签: java multithreading stringbuilder synchronized stringbuffer

我有以下代码:

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

请告知最佳方法。

2 个答案:

答案 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