1.在Java中锁的分类
其实就是按照锁的特性分类的
- 公平锁,非公平锁
- 可重入锁
- 独享锁,共享锁
- 互斥锁,读写锁
- 乐观锁,悲观锁
- 分段锁
- 偏向锁,轻量级锁,重量级锁
- 自旋锁
公平锁,非公平锁
- 公平锁:是指多个线程按照申请顺序获取锁
- 非公平锁:是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的先获取,会造成优先级反转或者饥饿现象。
非公平锁的优点是单位时间内吞吐量高,ReentrantLock默认使用非公平锁是基于性能考虑,公平锁为了保证线程规规矩矩地排队,需要增加阻塞和唤醒的时间开销。如果直接插队获取非公平锁,跳过了对队列的处理,速度会更快。
当一个线程请求锁时,会先判断队列中有没有其他线程在等待,然后再判断线程有没有被其他线程占用,如果都没有的话才会获取这个锁,非公平锁则会直接判断这个锁哟没有被占用,没有的话就会直接占用,谓之插队。只有当有线程占用的时候才会排队。
可重入锁
可重入锁表示当前线程获取锁之后,这个线程的其他需要找个锁的操作也能正常执行,
不可重入锁表示当前线程获取这个锁之后,这个线程的其他后续操作不能通过这个锁操作对象。