每天一道面试题(第一天)

目录

1.String StringBuffer 和 StringBuilder 的区别是什么?

2.既然说到synchronized,说说你对synchronized关键字的了解


1.String StringBuffer 和 StringBuilder 的区别是什么?

1.可变性

String类中使用final关键字修饰字符数组来保存字符串,private final char value[] ,所以String对象是不可变的

StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也使用字符数组保存字符串char[] value,但是没有用final关键字修饰,所以两种对象都是可变的

2.线程安全性

String中的对象是不可变的,也就可以理解为常量,线程安全

StringBuffer对方法加了同步锁,所以线程安全

StringBuilder并没有对方法进行加同步锁,所以非线程安全

3.性能

每次对 String 类型进⾏改变的时候,都会⽣成⼀个新的 String 对象,然后将指针指向新的 String

对象。StringBuffer 每次都会对 StringBuffer 对象本身进⾏操作,⽽不是⽣成新的对象并改变对象 引⽤。相同情况下使⽤ StringBuilder 相⽐使⽤ StringBuffer 仅能获得 10%~15% 左右的性能提升, 但却要冒多线程不安全的⻛险。

4.总结

1.操作少量数据: 用String

2.单线程操作字符串缓冲区下操作大量数据: 用StringBuilder

3.多线程操作字符串缓冲区下操作大量数据: 用StringBuffer

2.既然说到synchronized,说说你对synchronized关键字的了解

月薪1.5k的回答


  1. synchronized关键字解决的是多个线程之间资源访问的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行
  2. synchronized 分为类锁、对象锁。可以作用于实例方法、代码块、静态方法
  3. 另外,在java早期版本中,synchronized属于重量级锁,效率低下,因为监视器锁(monitor)是依赖于底层的操作系统的Mutex Lock 来实现的,java的线程是映射到操作系统的原生线程上的。如果要挂起或者唤醒一个线程,都需要操作系统帮忙完成,而操作系统实现线程之间的切换需要从用户态转换到内核态,这个状态之间的转换需要相对比较长的时间,时间成本相对比较高,这也是为什么早期的synchronized效率低的原因。
  4. 在java 6 之后java官方从JVM层面对synchronized做了较大优化,所以现在的synchronized锁效率也优化的很不错了,JDK1.6对锁的实现引入了大量的优化,如自旋锁、适应性自旋锁、锁消除、锁粗话、偏向锁、轻量级锁等技术来减少锁操作的开销

月薪20k的回答


除了以上的回答,添加synchronized底层实现原理的问答

  1. 从字节码的角度去看,synchronized同步代码块底层是靠monitorenter和monitorexit指令来保证锁的获取和释放,其中monitorenter指令指向同步代码块中开始的位置,monitorexit指令则指明同步代码块的结束位置,当执行monitorenter指令时,线程试图获取锁也就是获取monitor(monitor对象存在于每个java对象的对象头中,synchronized锁便是通过这种方式获取锁的,也就是为什么Java中任意对象都可以作为锁的原因)的持有权。当计数器为0则可以成功获取,获取后将锁计数器设置为1也就是加1。相应的在执行monitorexit指令后,将锁计数器设为0,表明锁被释放。如果获取对象锁失败,那当前线程就要阻塞等待,直到另外一个线程释放为止。
  2. synchronized普通同步方法底层是调用指令会检查方法的ACC_SYNCHRONIZED访问标志是否被设置,如果设置了,执行线程会将先持有monitor锁,然后再执行方法,最后在方法完成(无论是正常完成还是非正常完成)时释放monitor。synchronized静态同步方法字节码通过ACC_STATIC、ACC_SYNCHRONIZED访问标志区分该方法是静态同步方法。
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值