线程安全

若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。

比如一个 ArrayList 类,在添加一个元素的时候,它可能会有两步来完成:1. 在 Items[Size] 的位置存放此元素;2. 增大 Size 的值。

在单线程运行的情况下,如果 Size = 0,添加一个元素后,此元素在位置 0,而且 Size=1;

而如果是在多线程情况下,比如有两个线程,线程 A 先将元素存放在位置 0。但是此时 CPU 调度线程A暂停,线程 B 得到运行的机会。线程B也向此 ArrayList 添加元素,因为此时 Size 仍然等于 0 (注意哦,我们假设的是添加一个元素是要两个步骤哦,而线程A仅仅完成了步骤1),所以线程B也将元素存放在位置0。然后线程A和线程B都继续运行,都增加 Size 的值。

那好,我们来看看 ArrayList 的情况,元素实际上只有一个,存放在位置 0,而 Size 却等于 2。这就是“线程不安全”了。

String 类型和 StringBuffer 类型

主要性能区别:

String 是不可变的对象, 在每次对 String 类型进行改变的时候都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象。所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, 运行速度很慢。

使用 StringBuffer 类则结果就不一样了,每次结果都对 StringBuffer 对象本身进行操作,不是生成新的对象再改变对象引用。

推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。

在大部分情况下 StringBuffer > String

其他情况:

在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的:
 String S1 = “This is only a” + “ simple” + “ test”;
 StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);S1比Sb快很多

如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如:
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;

StringBuffer

Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。

主要操作

append 和 insert 方法

可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。

例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append("le") 会使字符串缓冲区包含“startle”,而 z.insert(4, "le") 将更改字符串缓冲区,使之包含“starlet”。

StringBuilder

java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。

大部分情况下 StringBuilder > StringBuffer

String、StringBuilder(非线程安全)、StringBuffer(线程安全相关推荐

  1. Java:代码验证 StringBuffer 线程安全,StringBuilder 非线程安全

    首先需要明白什么是线程安全,什么是非线程安全,引用百度百科  关于 Java 中 String,StringBuffer 和 StringBuilder 的区别,参看:  Java:String,St ...

  2. StringBuffer为什么是线程安全的,StringBuilder为什么不是是线程安全的,以及它们的使用场景(代码测试验证)

    我们都知道StringBuffer是线程安全,而StringBuilder不是线程安全的(原因大家肯定也知道,StringBuffer中的方法都加了synchronized关键字).所以网上很多资料都 ...

  3. String StringBuilder StringBuffer 对比 总结得非常好

    转自:http://www.iteye.com/topic/522167 作者:每次上网冲杯Java时,都能看到关于String无休无止的争论.还是觉得有必要让这个讨厌又很可爱的String美眉,赤裸 ...

  4. String, StringBuilder 与StringBuffer的区别与联系

    String, StringBuilder 与StringBuffer的区别与联系 @(JAVA)[java] 1.区别 (1)String构建的对象不能改变,每次对String进行操作时,如两个St ...

  5. Java char jdk_java学习系列之二---字符串(char.String.StringBuilder以及StringBuffer)

    一.String 1.String:字符串常量,字符串长度不可变.Java中String是immutable(不可变)的.String类是被final修饰 2.String str="hel ...

  6. String , StringBuilder , StringBuffer

    String 首先从String底层看起 从底层代码被final修饰,我们能看出来,String是只读字符串,他的成员方法也都默认为final方法.所以String所引用的字符串内容不能被改变 Str ...

  7. String详解(intern、StringBuffer、StringBuilder)

    "+"操作符,它执行的加入对原始类型(如int和double),重载对String对象进行操作.'+'两个字符串操作数进行串联. java不考虑让开发者支持运算符重载.在支持运算符 ...

  8. String StringBuilder StringBuffer三者之间的区别~~~

    String StringBuilder  StringBuffer三者之间的区别~~~ String是字符串常量,它是典型的immutable类,被声明final class,所有的属性都是fina ...

  9. stringbuffer常用方法_Java 处理字符串常用的类:String StringBuilder StringBuffer

    在Android/Java开发中,用来处理字符串常用的类有3种: String.StringBuilder.StringBuffer. 它们的异同点: 1) 都是 final 类, 都不允许被继承; ...

  10. String ,StringBuilder,StringBuffer的区分

    String ,StringBuilder,StringBuffer的区分 一.区别 String是字符串常量,而StringBuffer和StringBuilder是字符串变量.由String创建的 ...

最新文章

  1. DOCKER OVERLAY NETWORK consul 注册
  2. 化学博士6次投毒同事,只因对方给自己安排工作太多....
  3. 前端的各种各样的面试题大全
  4. newInstance() 方法
  5. 平面点集的最小包围圆 hdu 3932
  6. php申请证书,用phpstudy来申请SSL证书
  7. vue.js bootstrap 下拉列表_陕西省百度下拉总代理
  8. mysql记录当前表数据的数据条数据类型_MySQL学习记录:数据类型与操作数据表...
  9. java接口返回类,Java接口和返回类型 - java
  10. Dynamic Multipoint ***(DM***)
  11. POJ 3321 Apple Tree 【树状数组+建树】
  12. 新安装的apache无法解析php,apache无法解析php
  13. C#使用redis(简单例子)
  14. Linux下彻底卸载mysql
  15. HCIP-RS-H12-221题库以及解析(部分)
  16. 英语计算机简历模板,计算机研究生英文简历模板
  17. 对抗样本的创建和防御
  18. html文本框中加入跑马灯,CSS html文字的跑马灯(流光)特效
  19. java illegal key size,Java 解密错误InvalidKeyException: Illegal key size解决方法
  20. Linux升级ilo,利用HP iLO4安装系统

热门文章

  1. vue安装less环境
  2. 计算机服务器一般折旧年限,服务器主机折旧年限
  3. 微信支付 商品描述 body字段乱码
  4. Python之array.array
  5. plsql批量注释快捷键_PLSQL常用配置之窗口/版面保存、SQL格式化/美化、SQL注释\去掉注释等快捷键配置、登陆历史修改配置...
  6. 2022年中式烹调师(技师)操作证考试题库及模拟考试
  7. 人物专访 | 《复仇者联盟》特效工作室的小姐姐告诉你如何建立自己的工作室
  8. oracle的序列如何创建,oracle 创建序列的方法
  9. verilog 跨时钟域 单bit延迟打拍 多bit延迟采样 多bit计数延迟采样
  10. Nokia E71: 3G, 3M pixels CMOS, Wi-Fi, AGPS, BT v2.0, QWERTY, microSD