Java学习-每日面试题

Java中的锁

  1. synchronized 原理

基本上发现,synchronized修饰代码块时,是基于monitorenter和monitorexit 指令来实现的,并且进入同步代码是monitorenter,退出同步代码是monitorexit

synchronized是一种对象锁,是可重入的,但是不可中断的(这个不可中断指的是在阻塞队列中排队是不可中断),非公平的锁。

synchronized是基于JVM内置锁实现,通过内部对象Monitor(监视器锁)实现,基于进入与退出Monitor对象实现方法与代码块同步,监视器锁的实现依赖底层操作系统的Mutex lock(互斥锁)实现。

  1. JDK1.6之后 就会有锁升级的概念

jdk1.6之前 我们不管有多少并发 有多少线程 上来就用monitor对象的互斥性 把我们的java 对象给锁住 他们这样到底好吗 这样是对性能的消耗

对像头:32位: 细节查图

  1. synchronized 和 lock 的区别

区别如下:

  1. 来源: lock是一个接口,而synchronized是java的一个关键字,synchronized是内置的语言实现;

  1. 异常是否释放锁: synchronized在发生异常时候会自动释放占有的锁,因此不会出现死锁;而lock发生异常时候,不会主动释放占有的锁,必须手动unlock来释放锁,可能引起死锁的发生。(所以最好将同步代码块用try catch包起来,finally中写入unlock,避免死锁的发生。)

  1. 是否响应中断 lock等待锁过程中可以用interrupt来中断等待,而synchronized只能等待锁的释放,不能响应中断;

  1. 是否知道获取锁 Lock可以通过trylock来知道有没有获取锁,而synchronized不能;

  1. Lock可以提高多个线程进行读操作的效率。(可以通过readwritelock实现读写分离)

  1. 在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized。所以说,在具体使用时要根据适当情况选择。

  1. synchronized使用Object对象本身的wait 、notify、notifyAll调度机制,而Lock可以使用Condition进行线程之间的调度

  1. 什么是公平锁 什么是非公平锁

公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁

非公平锁:多个线程去获取锁的时候,会直接去尝试获取,获取不到,再去进入等待队列,如果能获取到,就直接获取到锁。

  1. lock 公平锁和非公平锁实现的原理

ReentrantLock lock=new ReentrantLock(true);//true表示获取公平锁

ReentrantLock lock=new ReentrantLock();//默认是非公平锁 ReentrantLock lock=new ReentrantLock(false);

  1. 什么是可重入锁 什么是不可重入锁,可重入锁的好处是什么

什么是可重入锁:

可重入,即一个线程可以多次(重复)进入同类型的锁而不出现异常(死锁),这里的死锁:自己等待自己释放再获取,所以无限循环。如:同一线程,执行逻辑中,嵌套获执行多个synchronized代码块或者嵌套执行ReentrantLock代码块。

什么是不可重入锁?

所谓不可重入锁,即若当前线程执行某个方法已经获取了该锁,那么在方法中尝试再次获取锁时,就会获取不到被阻塞。同一个人拿一个锁 ,只能拿一次不能同时拿2次。

好处:最大程度避免死锁。

  1. 独占锁,共享锁 互斥锁 排他锁 读写锁

独占锁:指该锁一次只能被一个线程所持有。对ReentrantLock和Synchronized而言都是独占锁

共享锁:指该锁可被多个线程所持有。对ReentrantReadWriteLock其读锁是共享锁,其写锁是独占锁。

互斥锁:锁本身就是互斥的

排他锁:等于读写锁中的写锁,因为其他人什么都不能干,所以“排他”。

读写锁:读写锁适合用于读操作多的场景。拥有读锁的线程可以读资源,拥有写锁的线程可以写资源。

某线程对资源加读锁时,其他线程可以也可以加读锁,但是不能加写锁(意味着有人在读的时候,其他人也能读,不能写)。

某线程对资源加写锁时,其他线程什么锁都不能加(意味着有人在写的时候,其他人什么都不能干)。

如果去申请不能加的锁,则阻塞。

读写锁有加读锁、加写锁、解锁三种操作。

  1. synchronized 锁升级

synchronized 锁升级过程就是其优化的核心:无锁-->偏向锁 --> 轻量级锁 --> 重量级锁

  1. 悲观锁 和 乐观锁

持悲观态度的锁。就在操作数据时比较悲观,每次去拿数据的时候认为别的线程也会同时修改数据,所以每次在拿数据的时候都会上锁,这样别的线程想拿到这个数据就会阻塞直到它拿到锁。

乐观锁乐观锁就是持比较乐观态度的锁。就是在操作数据时非常乐观,认为别的线程不会同时修改数据,所以不会上锁,但是在更新的时候会判断在此期间别的线程有没有更新过这个数据。

  1. 乐观锁的缺点

  • 缺点:不可重试,aba的问题

  • 解决:加版本号

  1. 怎样无锁也能保证原子性

乐观锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值