首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StringBuilder对StringBuffer

StringBuilder对StringBuffer
EN

Stack Overflow用户
提问于 2017-01-12 08:40:15
回答 2查看 409关注 0票数 0

StringBuffer和StringBuilder之间唯一/主要的区别是StringBuffer是线程安全的,而StringBuilder不是。

因此,当要从单个线程访问StringBuilder时使用它,在要从多个线程访问它时使用StringBuffer。

让我们考虑一个servlet的示例:

代码语言:javascript
复制
public class MyClass extends HttpServlet {
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      StringBuilder sb1 = new StringBuilder();
  }
}

现在,当请求到达servlet容器时,将创建新线程,因此上面示例中的get方法将从多个线程中访问。

问题是:

  1. StringBuilder的非同步性质是一个问题吗?是在线程之间共享相同的StringBuilder,还是在方法上声明它,因此每个线程都有单独的StringBuilder?
  2. 在哪种情况下,StringBuffer必须比StringBuilder更好?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-12 08:43:04

sb1是一个局部变量,因此每个线程都有自己的实例(每个线程将执行该new StringBuilder()语句)。在这种情况下使用StringBuilder是完全安全的。

如果您的代码是这样的话,这将是一个问题:

代码语言:javascript
复制
public class MyClass extends HttpServlet {

   private StringBuilder sb1 = new StringBuilder();

  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

  }
}

在本例中,您会遇到问题,因为所有线程都使用相同的MyClass实例,因为容器只是创建每个servlet的一个实例,每个servlet由所有线程共享。

还请注意,在这种情况下,即使是StringBuffer也有问题,因为对该属性的操作将是“原子的”(同步化的),但您无法确保访问该资源的顺序,结果可能会很混乱。

票数 3
EN

Stack Overflow用户

发布于 2017-01-12 09:00:58

1) servlet上下文中的每个servlet实例在多个请求之间共享。因此,如果为servlet创建实例变量,可能会出现线程安全问题,因为每个请求共享相同的内存,也共享实例变量。在这种情况下,StringBulder实例是在doGet方法中创建的,因此您不会想到这个问题。替代方法是使用线程同步。

2)使用StringBuffer可能会更好,因为您不需要每次都重新声明局部变量

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41608490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档