美文网首页大数据-简书hadoopkafka
由String,String Builder,String Bu

由String,String Builder,String Bu

作者: Java架构领域 | 来源:发表于2020-10-21 14:36 被阅读0次

    前言:

    String,StringBuilder,StringBuffer的区别是啥?这个面试题估计每个程序员都应该碰到过吧。依稀记得第一次面试的时候,面试官问我这个问题时,心想着这不是很简单吗。深入了解这个问题后,发现这里面并不简单,面试官的套路还是深啊!

    面试官:String,StringBuilder,StringBuffer的区别是啥?

    从可变性来讲String的是不可变的,StringBuilder,StringBuffer的长度是可变的。

    从运行速度上来讲StringBuilder > StringBuffer > String。

    从线程安全上来StringBuilder是线程不安全的,而StringBuffer是线程安全的。

    所以 String:适用于少量的字符串操作的情况,StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况,StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况。

    面试官:为什么String的是不可变的?

    因为存储数据的char数组是使用final进行修饰的,所以不可变。

    面试官:String类可以被继承嘛?

    不可以,因为String类使用final关键字进行修饰,所以不能被继承,并且StringBuilder,StringBuffer也是如此都被final关键字修饰。

    面试官:为什么String Buffer是线程安全的?

    这是因为在StringBuffer类内,常用的方法都使用了synchronized 进行同步所以是线程安全的,然而StringBuilder并没有。这也就是运行速度StringBuilder > StringBuffer的原因了。

    面试官:刚才你说到了synchronized关键字 ,那能讲讲synchronized的表现形式嘛?

    对于普通同步方法 ,锁是当前实例对象。

    对于静态同步方法,锁是当前类的class对象。

    对于同步方法块,锁是Synchonized括号配置的对象。

    面试官:能讲讲synchronized的原理嘛?

    synchronized是一个重量级锁,实现依赖于JVM 的 monitor 监视器锁。主要使用monitorenter和monitorexit指令来实现方法同步和代码块同步。在编译的是时候,会将monitorexit指令插入到同步代码块的开始位置,而monitorexit插入方法结束处和异常处,并且每一个monitorexit都有一个与之对应的monitorexit。

    任何对象都有一个monitor与之关联,当一个monitor被持有后,它将被处于锁定状态,线程执行到monitorenter指令时间,会尝试获取对象所对应的monitor的所有权,即获取获得对象的锁,由于在编译期会将monitorexit插入到方法结束处和异常处,所以在方法执行完毕或者出现异常的情况会自动释放锁。

    硬菜来了

    面试官:前面你提到synchronized是个重量级锁,那它的优化有了解嘛?

    为了减少获得锁和和释放锁带来的性能损耗引入了偏向锁、轻量级锁、重量级锁来进行优化,锁升级的过程如下:

    首先是一个无锁的状态,当线程进入同步代码块的时候,会检查对象头内和栈帧中的锁记录里是否存入存入当前线程的ID,如果没有使用CAS 进行替换。以后该线程进入和退出同步代码块不需要进行CAS 操作来加锁和解锁,只需要判断对象头的Mark word内是否存储指向当前线程的偏向锁。如果有表示已经获得锁,如果没有或者不是,则需要使用CAS进行替换,如果设置成功则当前线程持有偏向锁,反之将偏向锁进行撤销并升级为轻量级锁。

    轻量级锁加锁过程,线程在执行同步块之前,JVM会在当前线程的栈帧中创建用于存储锁记录的空间,并将对象头的Mark Word复制到锁记录(Displaced Mark Word)中,然后线程尝试使用CAS 将对象头中的Mark Word替换为指向锁记录的指针。如果成功,当前线程获得锁,反之表示其他线程竞争锁,当前线程便尝试使用自旋来获得锁。

    轻量级锁解锁过程,解锁时,会使用CAS将Displaced Mark Word替换回到对象头,如果成功,则表示竞争没有发生,反之则表示当前锁存在竞争锁就会膨胀成重量级锁。​​​

    面试官:内心OS:竟然没问倒他,看来让他培训是没啥希望了,让他回去等通知吧 。

    你的水平我这边基本了解了,我对你还是比较满意的,但是我们这边还有几个候选人还没面试,没办法直接给你答复,你先回去等通知吧。

    我:好的好的,谢谢面试官,我这边先回去了。内心OS:好险好险,一个string差点被问倒,幸好面试前好好看了一下,不然今天就是面试惨案了。

    最后:

    针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。​​​

    相关文章

      网友评论

        本文标题:由String,String Builder,String Bu

        本文链接:https://www.haomeiwen.com/subject/vltemktx.html