当前位置: 首页 > news >正文

容桂品牌网站建设江苏网站建设流程

容桂品牌网站建设,江苏网站建设流程,网站 必须有的功能,网站建设属于什么税StringBuilder和StringBuffer的用法是一致的,平常我们最多用到的方法就是append()拼接字符串和reverse()翻转字符串等等。二者看起来方法是一样的,确实也是这样,其实它俩唯一的不同在于StringBuilder不是线程安全的,而StringBuffe…

        StringBuilder和StringBuffer的用法是一致的,平常我们最多用到的方法就是append()拼接字符串和reverse()翻转字符串等等。二者看起来方法是一样的,确实也是这样,其实它俩唯一的不同在于StringBuilder不是线程安全的,而StringBuffer则是线程安全的

证明如下

验证StriingBuilder

我们分别用两个线程对同一StringBuilder对象追加不同的字符,查看结果

public static void main(String[] args) throws InterruptedException {StringBuilder builder = new StringBuilder();StringBuffer buffer = new StringBuffer();Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 1000; i++) {builder.append("A");}}});Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 1000; i++) {builder.append("B");}}});t1.start();t2.start();t1.join();t2.join();System.out.println(builder.toString());}

结果:

        我们发现,线程1(追加字符‘a’)运行得好好的,突然线程2(追加字符‘b’)也加了进来,两个线程轮流对StringBuilder对象进行操作10f53a0618f5473795700a3229217c5f.png        此外,还发生了下标越界的报错,可能是因为两个线程在争夺资源的时候发生的错误,毕竟StringBuilder的底层其实是一个char数组,线程 A 想要在位置 i 插入字符,而线程 B 想要在相同的位置 i 插入不同的字符。这将导致一个或者两个操作执行失败或者得到错误结果。所以运行结果中不只有AB两种字符,还有一个类似乱码的字符

744458881fbc4fc98d044092ddba1ff5.png

结论:StringBuilder不是线程安全的

验证StringBuffer

验证方法和上面一直,我们分别用两个线程对同一StringBuffer对象追加不同的字符,查看结果

public static void main(String[] args) throws InterruptedException {StringBuilder builder = new StringBuilder();StringBuffer buffer = new StringBuffer();Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 1000; i++) {buffer.append("A");}}});Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 1000; i++) {buffer.append("B");}}});t1.start();t2.start();t1.join();t2.join();System.out.println(buffer.toString());}

 结果:

        我们发现,尽管是两个线程,但是并没有因为抢占公共资源(同一个StringBuffer对象)而交替执行,而是很丝滑快速的执行完成,更没有报错。 

a8ec8fad90364e3586b2a8e167f63aaa.png

结论:StringBuffer是线程安全的 

总结

两个线程同时操作同一个 StringBuilder 对象,如果没有采取合适的同步机制,那么就会出现下标越界的错误。

在多线程环境下,由于线程调度是不可控的,两个线程可能同时访问同一个 StringBuilder 对象,并且同时调用 append() 或 insert() 等方法进行修改操作。由于 StringBuilder 不是线程安全的类,在并发访问时可能会出现以下问题:

1. 竞态条件:如果两个线程在同一时间进行 append() 或 insert() 操作,则可能会导致竞态条件。例如,线程 A 想要在位置 i 插入字符,而线程 B 想要在相同的位置 i 插入不同的字符。这将导致一个或者两个操作执行失败或者得到错误结果。

2. 内存可见性:如果两个线程分别持有 StringBuilder 的不同实例,并且每个实例都缓存了修改后的值,则另一个线程可能无法看到这些更改,因此应该使用 volatile 关键字保证内存可见性。

综上所述,为了避免 StringBuilder 下标越界错误和其他多线程问题,需要采取合适的同步机制来保证对 StringBuilder 的访问是互斥、有序和可见的。例如可以使用 synchronized 来锁住StringBuilder对象,或者使用 ConcurrentLinkedQueue<StringBuilder> 之类的线程安全容器来避免竞争条件。

        因此,当我们今后使用的时候,需要注意场景。如果是比如多线程爬虫将爬到的内容拼接在一起的话,需要使用StringBuffer,而一般单线程的情况下可以使用StringBuilder。

 

http://www.yayakq.cn/news/137624/

相关文章:

  • 彩票网站建设安全度怎样在各大网站做有效的宣传
  • 长安网站建设公司建设行业网站大概需要都少钱
  • 模板做网站x网站免费模板
  • 福州网站优化公司做美食网站的模板
  • 简单网站的代码盐城网站建设价格
  • 标准网站建设哪家好网络调查问卷怎么制作
  • 网站服务器崩溃一般多久可以恢复电脑如何创建网页
  • 网站建设找导师蓝林全屋定制十大品牌
  • 衡粘水佩网站建设如何注册网店开店
  • 云南建设学校网站首页家纺网站建设
  • 公司网站自己怎么建立怎么查网站注册时间
  • dw课设做网站一般在百度做网站多少钱
  • 百度竞价设不同网站培训方案模板
  • 建工集团两学一做网站新乡最新消息
  • 四川建设行业数据共享平台的网站学编程怎么入门
  • 网站二级目录打不开网站开发语言怎么样
  • 黑龙江网架公司seo免费优化工具
  • 网站建设工作室需要哪些设备购物网站风格
  • 纪检监察门户网站建设论证报告做网站用的插件
  • 海口网站制作网站如何做网站的软件
  • 怎么查看网站备案号jq 网站模板
  • 网站优化软件哪个好钱包钱夹移动网站建设
  • 怎么样才能搜索到自己做的网站51电子网
  • 怎么做网页模板展示网站深圳宝安网站建设工
  • 建站网站平台淮南网站推广
  • 建设电影会员网站微企点建站怎么样
  • 建设网站可以搜索电影网站设计的主要特点
  • 网站开发程序有哪些网页制作软件中的三剑客是指
  • 网站seo专员wordpress邮箱汉化插件
  • 修改网站版权江西省建设厅网站官网