✅Java中有哪些锁_
典型回答
这个问题可太大了,因为所有的锁都可以回答。因为我们可以根据不同的分类方式进行介绍。
如果只提Java内置的锁的话,那么主要就是**synchronized**** 和****ReentrantLock**这两种锁。
✅synchronized和reentrantLock区别?
通过**synchronized**** 和****ReentrantLock**的相同点和不同点来说的话,可以有这么几种锁的定义。
- **阻塞锁&非阻塞锁:**拿不到锁时线程挂起,直到被唤醒,比如
synchronized、ReentrantLock都是阻塞锁。 - 可重入锁VS不可重入锁:
- 可重入锁:一个线程可以多次获取同一把锁(计数器+1,释放时-1),比如
synchronized、ReentrantLock。
- 可重入锁:一个线程可以多次获取同一把锁(计数器+1,释放时-1),比如
- 公平锁VS非公平锁:
synchronized和ReentrantLock默认都是非公平锁。
- 偏向锁、轻量级锁、重量级锁:涉及到
synchronized的锁膨胀的过程。
- 乐观锁VS悲观锁:这是代码中比较常用的用来做并发防控的,一般在数据库层面出现的比较多。
synchronized、ReentrantLock都是悲观锁,CAS是乐观锁
- **读写锁 VS StampedLock:**StampedLock支持 悲观读锁、写锁,还支持 乐观读,比
ReadWriteLock性能更好。 - **自旋锁:**线程不会立即阻塞,而是通过循环等待锁释放,避免线程切换开销。JVM 在
synchronized的轻量级锁中用到。
- 分布式锁VS 单机锁:
- 数据库锁
- 无锁:如volatile、不可变模式、ThreadLocal等。(为啥要提这个,因为他也是一种解决并发问题的方案)
- 活锁 VS 死锁