JAVA面试题总结-多线程(52-56)

52.说一下 synchronized 底层实现原理?

我们在使用synchronized加锁的时候发现,不需要我们lock或unlock,因为这些JVM都帮我们实现了。

当synchronized作用同步代码块的时候,JVM采用monitorenter和monitorexit两个指令完成同步, monitorenter指向代码块的开始位置,monitorexit指向代码块的结束位置,当线程执行到monitorenter指向的位置,需要先获取锁才能执行下面的方法,当线程执行到monitorexit指向的位置,需要释放锁。底层维护一个计数器,获取锁+1,释放锁-1。

当synchronized作用同步方法的时候,会有一个ACC_SYNCHRONIZED标识符,当线程要执行有该标识符的方法时需要先获取锁。

53.synchronized 和 volatile 的区别是什么?

synchronized可以作用于变量、方法、类、代码块上,而volatile只能作用在变量上。

synchronized可能会导致线程阻塞,而volatile不会导致线程阻塞。

synchronized可以保证变量的原子性和可见性,而volatile不能保证原子性,能保证可见性和有序性。

synchronized标记的标量可以被编译器优化,而volatile标记的变量不会被编译器优化。(这里也是volatile有序性的体现,因为在创建对象的时候,JVM底层会按分配内存-->初始化对象-->对象引用指向分配的内存地址的顺序执行,但是编译器优化会使其重排序,会按分配内存-->对象引用指向分配内存--->初始化对象顺序执行,此时在多线程的情况下就可能会使引用的对象还没有初始化,volatile可以保证不进行重排序,保证有序性)

54.synchronized 和 Lock 有什么区别?

synchronized是Java语言的关键字,基于JVM实现的,而Lock是一个接口。

synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁的发生,而Lock发生异常的时候不会自动释放线程占有的锁,如果不手动释放,则很有可能发生死锁现象,因此使用Lock要配合lock()和unlock()在try和finally语句中使用。

synchronized加的锁只能等待锁的释放,不能响应中断,而Lock有interrupt()方法来中断等待。

Lock可以用trylock()方法来知道有没有获取锁,而synchronized不能。

Lock可以实现读写分离,而synchronized不能。

从性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈,此时Lock的i性能要远远由于synchronized。

55.synchronized 和 ReentrantLock 区别是什么?

synchronized是Java语言的关键字,基于JVM实现的,而ReentrantLock是基于JDK的API层面实现的。

synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁的发生,而ReentrantLock在发生异常时,不会自动释放线程占有的锁,如果不手动释放,则很有可能发生死锁现象,因此使用ReentrantLock要配合lock()和unlock()在try和finally语句中使用。

synchronized与wait()和notify()/notifyAll()方法实现等待和通知机制,而ReentrantLock则需要借助Condition接口和newCondition()方法实现。

synchronized只能加非公平锁,而ReentrantLock既可以加公平锁也可以加非公平锁。

ReentrantLock比synchronized多了一些高级的功能,例如用lock.lockInterruptibly()实现等待中断,以及加公平锁等。

56.说一下 atomic 的原理?

在多线程的场景中,我们保证数据安全,就会用到同步的方案,通常使用synchronized或者Lock处理,使用synchronized就意味着内核态的一次切换,这是一个很重的操作。那有没有什么方法,可以比较便利的实现一些简单的数据同步,比如计数器等等。concurrent包下的atomic提供一个用法简单、性能高效、线程安全的数据同步的选择。

atomic原子操作类通过CAS(Compare And Swap,比较并交换,主要是通过CPU指定来保证原子性的,CAS指令包含3个参数:共享变量的内存地址A、预期的值B和共享变量的新值C,只有当内存地址A中的值和B相等的时候,内存地址A中的值才会更新为新值C)保证原子性,通过自旋保证修改的成功,通过多段锁来降低锁粒度从而提高并发性能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值