为什么stringbuffer线程安全2
发布网友
发布时间:2023-10-20 04:15
我来回答
共2个回答
热心网友
时间:2024-11-24 02:52
这就要说说String了.
String是一次性的,一旦初始化后就不能改变String对象的值.除非指向另一个String对象.
所以不存在线程安全问题.
而StringBuffer对象可以在创建之后不断的改变.为了保证当前线程操作的StringBuffer不受其它线程影响,所以就把StringBuffer设计成了线程安全的.
比如
StringBuffer sb = new StringBuffer("abcdefg");
在线程A里,
int end = sb.length()-1; --1
sb.getCharAt(end);--2
在线程B里,
int end = sb.length()-1;--3
sb.deleteCharAt(end);--4
如果线程A执行到1,然后跳转到线程B,执行完3,4,再转回线程A执行2.那么就会抛出异常了.
当然也可以不把StringBuffer设计成线程安全的.只是因为StringBuffer使用比较广泛,为了预防未知的线程安全问题,所以设计成线程安全的.
热心网友
时间:2024-11-24 02:53
是的
StringBuffer的很多方法用synchronized修饰,意味着多个线程只能互斥地调用这个方法。
例如StringBuffer的append方法,对于多线程编程,多个线程不能同时使用这个方法。
StringBuilder的方法没有这个*。如果用于多线程程序,可能会造成错误。
一个方法包含若干语句,编译成二进制代码就更多了。线程随时可能被中断,比如时间片中断、按键中断、网卡有数据到达引发中断等。线程A在执行append,还没完成就中断了。线程B运行,也执行这个串对象的append。随后A继续append未完的部分。会造成错误。如果你学过OS就会知道这点。