StringBuffer和StringBuilder之间唯一/主要的区别是StringBuffer是线程安全的,而StringBuilder不是。
因此,当要从单个线程访问StringBuilder时使用它,在要从多个线程访问它时使用StringBuffer。
让我们考虑一个servlet的示例:
public class MyClass extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
StringBuilder sb1 = new StringBuilder();
}
}现在,当请求到达servlet容器时,将创建新线程,因此上面示例中的get方法将从多个线程中访问。
问题是:
发布于 2017-01-12 08:43:04
sb1是一个局部变量,因此每个线程都有自己的实例(每个线程将执行该new StringBuilder()语句)。在这种情况下使用StringBuilder是完全安全的。
如果您的代码是这样的话,这将是一个问题:
public class MyClass extends HttpServlet {
private StringBuilder sb1 = new StringBuilder();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}在本例中,您会遇到问题,因为所有线程都使用相同的MyClass实例,因为容器只是创建每个servlet的一个实例,每个servlet由所有线程共享。
还请注意,在这种情况下,即使是StringBuffer也有问题,因为对该属性的操作将是“原子的”(同步化的),但您无法确保访问该资源的顺序,结果可能会很混乱。
发布于 2017-01-12 09:00:58
1) servlet上下文中的每个servlet实例在多个请求之间共享。因此,如果为servlet创建实例变量,可能会出现线程安全问题,因为每个请求共享相同的内存,也共享实例变量。在这种情况下,StringBulder实例是在doGet方法中创建的,因此您不会想到这个问题。替代方法是使用线程同步。
2)使用StringBuffer可能会更好,因为您不需要每次都重新声明局部变量
https://stackoverflow.com/questions/41608490
复制相似问题