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、分布式知识

posted @ 2022-12-20 08:51  羽绒333  阅读(15)  评论(0编辑  收藏  举报