• Java知识点笔记


    一、StringBuffer是线程安全的

    线程是否安全性能推荐使用场景
    StringBuffer 线程安全多线程环境
    StringBuilder非线程安全单线程环境

    主要因为StringBuffer很多方法都是synchronized 修饰的,下面是部分源码:

    1. @Override
    2. public synchronized int length() {
    3. return count;
    4. }
    5. @Override
    6. public synchronized int capacity() {
    7. return value.length;
    8. }
    9. @Override
    10. public synchronized void ensureCapacity(int minimumCapacity) {
    11. super.ensureCapacity(minimumCapacity);
    12. }
    13. /**
    14. * @since 1.5
    15. */
    16. @Override
    17. public synchronized void trimToSize() {
    18. super.trimToSize();
    19. }
    20. /**
    21. * @throws IndexOutOfBoundsException {@inheritDoc}
    22. * @see #length()
    23. */
    24. @Override
    25. public synchronized void setLength(int newLength) {
    26. toStringCache = null;
    27. super.setLength(newLength);
    28. }

    线程安全的优势就是他可以在多线程环境下使用。多线程不要用StringBuilder,否则会出现问题。

    1. public class Thread {
    2. public static void main(String[] argaa) {
    3. MyString myString = new MyString();
    4. StringBuilder stringBuilder= new StringBuilder();
    5. StringBuffer stringBuffer = new StringBuffer();
    6. for (int i = 0; i < 1000; i++) {
    7. new Thread(new Runnable() {
    8. @Override
    9. public void run() {
    10. for (int j = 0; j < 1000; j++) {
    11. myString .append(1);
    12. stringBuilder.append("1");
    13. stringBuffer.append("1");
    14. System.out.println(myString .getNum() + "-" + stringBuilder.length() + "-" + stringBuffer .length());
    15. }
    16. }
    17. }).start();
    18. }
    19. }
    20. }
    21. class MyString {
    22. private Integer num = 0;
    23. public Integer getNum() {
    24. return num;
    25. }
    26. public void setNum(Integer num) {
    27. this.num = num;
    28. }
    29. public synchronized void append(Integer num) {
    30. this.num = this.num + num;
    31. }
    32. }

    输出结果:

    上面的代码中,用了自己定义的MyString类与StringBuffer以及StringBuilder。启用了1000个线程,每个线程都进行“累加”操作,并打印结果。

    结果显示,StringBuffer是正确答案,StringBuilder少于正确答案,而MyString,会根据append方法是否加上synchronized关键字而显示不同结果。

    所以StringBuilder不能用于对同一对象进行多线程操作。不过在一般项目中一般对字符串的操作,并不会用到多线程,所以绝大多数时候,用StringBuilder即可。

    二、i++,++i的区别:

    1. int a = 1;
    2. int b = 1;
    3. //先参与外运算,再运算++
    4. System.out.println(a++);
    5. //先参与++,再参与外运算
    6. System.out.println(++b);

    输出结果:

    1. 1
    2. 2

    i++先是i参与外运算,外运算完成再运算i=i+1

    比如for循环中的for(int i = 0; i < 10; i++){},那么参与for循环的第一次就是i=0。
     

  • 相关阅读:
    Java基于小程序的讲座预约系统,附源码,教程
    Nature工作-通用时序(PHM)大模型//(构思中)
    特征交叉系列:FM和深度神经网络的结合,DeepFM原理简述和实践
    【科技与狠活】如何利用Python绘制足球场
    hangfire安装
    MySQL 与 PostgreSQL的区别
    Hybrid Astar 算法剖析和实现(七)
    MybatisPlus中queryWrapper的or的使用
    Java笔记——控制台模拟“双色球”福利彩票游戏
    阿里云云原生一体化数仓 - 数据安全能力解读
  • 原文地址:https://blog.csdn.net/m0_51660523/article/details/124951957