专栏首页JVMGCStringBuilder与StringBuffer
原创

StringBuilder与StringBuffer

StringBuilder

package com.keytech.task;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

//线程不安全
public class StringExample1 {

    public static Integer clientTotal=5000;
    public static Integer threadTotal=200;
    public static StringBuilder stringBuilder=new StringBuilder();

    public static void main(String[] args) throws  Exception{
        ExecutorService executorService = Executors.newCachedThreadPool();
        final Semaphore semaphore=new Semaphore(threadTotal);
        final CountDownLatch  countDownLatch=new CountDownLatch(clientTotal);
        for (int i = 0; i < clientTotal; i++) {
            executorService.execute(()->{
                try{
                    semaphore.acquire();
                    update();
                    semaphore.release();

                }catch (Exception e){
                    e.printStackTrace();
                }
                countDownLatch.countDown();
            });
        }
        countDownLatch.await();
        executorService.shutdown();
        System.out.println("size"+stringBuilder.length());

    }

    private static void update() {
        stringBuilder.append("1");
    }

}

//size:4999

main函数中输出的结果不为预期的5000,并且每次结果可能会不一致,因此StringBuilder是线程不安全类

StringBuffer

package com.keytech.task;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
//线程安全
public class StringExample2 {

    public static Integer clientTotal=5000;
    public static Integer threadTotal=200;
    
    public static StringBuffer stringBuffer=new StringBuffer();

    public static void main(String[] args)  throws Exception{
        ExecutorService executorService = Executors.newCachedThreadPool();
        final Semaphore semaphore=new Semaphore(threadTotal);
        final CountDownLatch countDownLatch=new CountDownLatch(threadTotal);

        for (int i = 0; i < clientTotal; i++) {
             executorService.execute(()->{
                 try{
                     semaphore.acquire();
                     update();
                     semaphore.release();

                 }catch (Exception e){
                     e.printStackTrace();
                 }
                 countDownLatch.countDown();
             });
        }
        countDownLatch.await();
        executorService.shutdown();
        System.out.println("size:"+stringBuffer.length());


    }

    private static void update() {
        stringBuffer.append("1");
    }
}

//size:5000

StringBuffer每次输出的结果与预期结果一致,因此它是线程安全的类

StringBuffer使用synchronized保证线程安全

 @Override
 public synchronized StringBuffer append(String str) {
   toStringCache = null;
   super.append(str);
   return this;
 }

总结

通过以上两个例子可以知道,StringBuffer为线程安全类,StringBuilder为线程不安全类。 StringBuffer在方法的实现上使用了synchronized关键字对方法进行同步,因此是线程安全的,而StringBuilder则没有进行特殊的同步或并发处理。

StringBuffer使用了同步锁,同一时间只能有一个线程进行访问,因为在系统性能会有损耗,适用于多线程环境下使用。通常情况下,字符串拼接出现在方法内(在方法中以局部变量的方式使用,可以做到线程封闭),使用StringBuilder进行字符串的拼接会大大提高性能,属于堆栈封闭,单个线程的操作对象,因此不存在线程不安全问题,优先选择使用StringBuilder。两种字符串拼接类分别适用不同的场景,这就是为什么JAVA同时提供了这两种类。

wx.jpg

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • StringBuilder,String与StringBuffer 的异同

    用户1665735
  • String与StringBuffer与StringBuilder之间的差异

    参考链接: Java stringbuffer和stringbuilder之间的差异

    用户7886150
  • String、StringBuffer与StringBuilder之间区别

    最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,StringBuilder的东西,现在整理一下。

    DencyCheng
  • 转:String,StringBuffer与StringBuilder的区别??

    String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全)  简要的说, String 类...

    Dar_Alpha
  • String及StringTable(四):StringBuffer与StringBuilder对比

    分析完StringBuilder,然后再聊StringBuffer就简单多了。因为StringBuffer同样也是继承了AbstractStringBuilde...

    冬天里的懒猫
  • [十四]基础类型之StringBuffer 与 StringBuilder对比

    StringBuilder是StringBuffer的版本改写,下面从几个方面简单的对比下他们的区别

    noteless
  • 【图文详解系列】String,StringBuffer与StringBuilder的区别

    字符串广泛应用 在Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。

    一个会写诗的程序员
  • String、StringBuilder和StringBuffer

    在之前的文章「 Java 中 String 类为什么要设计成不可变的?」中对 String 的特性已经作了总结。这篇文章主要介绍另外两个常用的类 StringB...

    用户3596197
  • Java--StringBuilder,StringBuffer,StringJoiner

    开始自己的一个半年计划,也就是java相关常用类的源码阅读,通过阅读查漏补缺,加深基础知识的运用与理解.

    屈定
  • +、StringBuffer、StringBuilder区别

    零、故事 小王是一个一年经验的新 Java 程序员,最近他负责的模块出现了性能问题,每次执行的时间总是在十多秒。小王经过排查终于找出来原因了,是因为在字符串连...

    喵叔
  • StringBuffer和StringBuilder类

    参考链接: Java中的String vs StringBuilder vs StringBuffer

    用户7886150
  • StringBuffer 和StringBuilder类

    当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类以及 String 类不同的是,StringBuffer 和 S...

    用户5224393
  • String/StringBuffer/StringBuilder的区别?

    String是不可变的,StringBuilder和StringBuffer都是可变的。

    黑洞代码
  • 第三阶段-Java常见对象:【第四章 StringBuilder、StringBuffer类】

    --------------------------------------------------------------------------------...

    BWH_Steven
  • 面试题系列第8篇:谈谈String、StringBuffer、StringBuilder的区别?

    关于字符串的面试题除了内存分布、equals比较,最常见的就是与StringBuffer和StringBuilder之间的区别了。

    程序新视界
  • Java|String、StringBuffer和StringBuilder的区别

    java.lang.String、java.lang.StringBuffer、java.lang.StringBuilder.

    算法与编程之美
  • 深入理解String、StringBuffer和StringBuilder类的区别

    Java提供了String、StringBuffer和StringBuilder类来封装字符串,并提供了一系列操作字符串对象的方法。

    本人秃顶程序员
  • String类常用方法(重要)

    int length():返回字符串的长度: return value.length

    乐心湖
  • Java StringBuffer和StringBuilder类

    当对字符串进行修改的时候,需要使用StringBuffer和StringBuilder类。 和String类不同的是,StringBuffer和StringBu...

    郭耀华

扫码关注云+社区

领取腾讯云代金券