StringBuilder和StringBuffer的区别以及衍生题目
相同
1、都是操作字符串
2、都继承抽象类 AbstractStringBuilder
区别
StringBuilder线程不安全,StringBuffer线程安全
为什么
StringBuffer线程安全,是因为底层的方法都使用synchronized修饰
StringBuffer线程安全问题
在单机环境是线程安全的吗?是线程安全的。
在分布式环境是线程安全的吗?不安全,因为synchronized是本地锁。
单机环境StringBuffer线程安全
public class Test {
public static void main(String[] args) {
Ticket ticket = new Ticket();
Thread t1 = new Thread(ticket,"A");
Thread t2 = new Thread(ticket,"B");
t1.start();
t2.start();
}
}
class Ticket implements Runnable{
private StringBuffer str = new StringBuffer("str");
public Ticket(){}
public void sale() throws InterruptedException {
for (int i = 0; i < 3; i++) {
// 线程休眠时为了让别的线程进来append
Thread.sleep(100);
str.append(Thread.currentThread().getName());
}
// 线程休眠是为了让所有线程都执行完for循环再sout
Thread.sleep(2000);
System.out.println(str.toString());
}
@Override
public void run() {
try {
sale();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
分布式环境StringBuffer线程不安全
分布式环境下从数据库中取得”str“,存到StringBuffer str = new StringBuffer("str")。
A机10个线程,B机10个线程,同时去修改str,当拿到str字符串就append一下。A的线程就append一个A,B的线程就append一个B。
当A1线程拿到str,A1线程进行append,此时str="strA",当要return的时候,B1线程进来了,此时str="str",于是append一下,然后返回,此时str=”strB“,然后到A1 线程执行return,此时str = ”strA“
本来的结果是strAB,此时是strA,出现了线程安全问题。
StringBuffer在分布式环境不安全,怎么解决?
分布式锁
啥业务会考虑用到StringBuffer呢?能举一个例子吗?
StringBuffer在多机环境行不通,然后才用的分布式锁?
上述问题主要考察了什么?
1、Java基础知识
2、Java源码
3、是否有举一反三,反思的习惯
4、分布式知识