目录

什么是死锁?

什么是死锁?

就是比如说,我们有两个或者两个以上的这个进程或者线程,都在等待对方释放资源的话,那其实没有一方提起这个释放资源的操作的话呢,就从而造成了一种阻塞的现象,这个称之为死锁。结果就是说我们两个进程或者两个线程他们都会陷入到一个无限等待中,我也可以简单的说一下,就是,就是面试官您给我说,如果我回答上这个问题的话,你就给我这个ofer,那如果我说如果你给我这个ofer的话,我就回答您这个问题,那俩都在等待对方释放这个锁嘛,那这样就造成了一个死锁问题,就是这样的。

你都了解java 一些什么锁?

锁的话比如说 Synchronized,还有我们的 ReentrantLock(晕春特老克),读写锁了解的不多就没有研究了

Synchronized 的实现原理

Synchronized 是我们 JVM中实现的一种锁 ,然后这种锁,请用这种锁的一种获取啊,和它的释放方式啊,分别都是我们的monitorenter(模令特晕特),还有我们的monitorenter的一个指令,那这个锁在实现上分为了我们的而偏向锁还有我们的轻量级锁,还有我们的重量级锁,其中我们的偏向锁在1.6是默认开启的,然后轻量级锁呢是在我们的多线程竞争里面情况下,他是会膨胀成重量级锁也就是说有关于我们的这个锁的数据,他都会保存在我们的这个对象头中。

ReentrantLock的实现原理

ReentrantLock他是基于AQS 实现的

什么是 AQS?

就是在我们的 AQS的内部中会保存一个变量 state,一个状态变量 state,然后通过 CAS 去修改这个变量值,如果有修改成功的话,这个线程就会被表示我们获取到了这个锁,如果没有修改成功的话就是或者说,我们发现这个state,已经是一个加锁状态,那么就是通过一个waiter,这个对象封装线程,添加到等待队列里面,然后我们再把他给挂起啊,等待被唤醒。

CAS 实现原理

CAS 是通过 unsafe类里面的compareAndSwap 法实现的。

那你知道这个方法里面的具体参数含义吗?

这个看到有点久远了,他第一个参数是要修改的对象,第二个参数呢,是对象中要修改变量的这个偏移量,第三个参数呢就是我们修改之前的值,然后第四个参数是我们预想修改之后的值。