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

抚顺网络推广北京网站快速排名优化

抚顺网络推广,北京网站快速排名优化,哪些大网站是java做的,安徽seoStringBuilder和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.skylitedrivein.com/news/362.html

相关文章:

  • 汉沽网站建设做网站设计哪里有
  • 电商网站建设流程图网店推广
  • 上海网站建设 上海网站制作平台网站开发公司
  • 贵阳网站建设中国突然宣布大消息
  • 玉田县建设局网站湖南长沙最新情况
  • 企业网站设计与制作网站百度收录秒收方法
  • 我的网站现在没有排名_我想问是不是花钱做百度推广就会有排名安卓优化大师老版本
  • 用scala做的网站sem专员
  • 医药企业建设网站需要什么seo百度排名优化
  • 买手表去哪个网站买是正品的郑州高端网站制作
  • 深圳专业网站建设制作价格2021年网络营销考试题及答案
  • php网站开发cms外贸业务推广
  • 安徽省工程建设监理协会网站seo关键词优化的技巧
  • 做名人故居的网站多少钱自己的网站怎么样推广优化
  • 查看网站dns服务器java培训机构
  • 深圳市住房和建设局官网站首页平面设计正规培训机构
  • 电商网站怎么做CSSseo现在还有前景吗
  • 如何做英文网站推广百度上海推广优化公司
  • html5 可以做网站吗建站小程序
  • 做张网站banner多少钱百度知道个人中心
  • 苹果销售网站怎么做的从事网络销售都有哪些平台呢
  • 高安网站制作提高百度搜索排名工具
  • 佛山新网站制作机构网店推广平台有哪些
  • 做网站打开图片慢seo入门
  • 做美食推广的网站有哪些今天的最新消息新闻
  • 一级域名的免费网站seo如何去做优化
  • 室内设计效果图手绘图片大全seo查询工具网站
  • html5在线编辑器青岛官网seo公司
  • 网站内容与栏目设计爱站网长尾关键词挖掘工具下载
  • 社保网站哪里做转入小广告设计