java - StringBuffer 还是同步方法?

标签 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 对象可以正常工作 多线程系统。 必须如何将此代码更改为线程安全的?

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/

相关文章:

c# - 根据 DateTime 左移计算优先级

c# - 中断休眠线程

java - String vs Char Array vs String Builder(效率表现)

.net - 如何在 .NET 中通过索引有效地覆盖字符串的一部分?

java - 更好地处理android中的数字格式异常

java - 引用内部类的字段

java - 无法理解我的 Spring DTO 的工作原理

multithreading - C++0x线程问题

c# - WebRequest 挂起用户界面

java - 在 Java 中,什么时候我应该更喜欢 String 而不是 StringBuilder,反之亦然?