参考:
> https://blog.csdn.net/xy3233/article/details/109148096
> https://blog.csdn.net/xy3233/article/details/109148052
> https://blog.csdn.net/xy3233/article/details/109148234
常见问题:
死锁原因(必要条件缺一不可):
① 互斥② 不可剥夺③ 请求与保持④ 循环等待
死锁解法:只要破坏四个条件之一即可
① 超时放弃② 顺序请求
java中的锁synchronized 和 Lock
synchronized: java关键字,锁在JVM层面, 无法判断锁状态, 出现异常自动释放,是一个非公平锁,可重入锁(计数器实现)。
锁膨胀:随着锁的竞争,锁可以从偏向锁升级到轻量级锁,再升级的重量级锁,但是锁的升级是单向的,也就是说只能从低到高升级,不会出现锁的降级.
synchronized锁有四种状态:
偏向锁:无实际竞争,且将来只有第一个申请锁的线程会使用锁。
轻量级锁:无实际竞争,多个线程交替使用锁;允许短时间的锁竞争。
重量级锁:有实际竞争,且锁竞争时间长。
synchronized,可以加在代码块上,也可以加在方法上
synchronized + static 锁对象时class对象
synchronized 方法/代码块 锁对象时this
Lock:Lock是一个接口,主要实现类有ReentrantLock, ReentrantReadWriteLock(ReadLock,WriteLock)
Lock发生异常不会自动释放,必须要在finally中释放锁
ReentrantReadWriteLock: 有读锁和写锁
读锁和写锁是互斥锁
读锁本身是一个共享锁
写锁是一个独享锁
并发包会专门开一篇