锁对比
一、公平锁与非公平锁
公平锁指的是锁的分配机制是公平的,通常是先到先得,RenntrantLock可以在构造函数中定义公平和非公平
非公平锁,随机、就近原则分配锁的机制,线程过来后会先自旋,尝试直接获取到锁,获取不到再去排队。非公平锁的效率要更高。
二、ReentrantLock和Synchronized
lock通过lock()和unlock()来进行加锁和解锁的操作,synchronized会被jvm自动解锁。
lock的优势是可中断、公平锁、多个锁。
三、Condition和Object类锁方法区别
Condition是lock锁里面的类。
1. Condition 类的 awiat 方法和 Object 类的 wait 方法等效
2. Condition 类的 signal 方法和 Object 类的 notify 方法等效
3. Condition 类的 signalAll 方法和 Object 类的 notifyAll 方法等效
4. ReentrantLock 类可以唤醒指定条件的线程,而 object 的唤醒是随机的
四、tryLock 和 lock 和 lockInterruptibly 的区别
tryLock能获得锁返回true,不能就立即返回false,还可以增加时间限制,超过时间没有获得锁(定时),返回false
lock是能获得返回true、不能就一直等待获得锁。
lock和lockinterruptibly,lock中断不会报错,lockinterruptibly中断会报错。
五、Semaphore信号量
Semaphore是一种基于计数的信号量,可以设定阈值,来限定线程,多个线程来竞争获取许可信号,做完自己的申请后归还,超过阈值的线程,将被阻塞。可以用来构建对象池、资源池、数据库连接池。
实现互斥锁(计数器为 1)
我们也可以创建计数为 1 的 Semaphore,将其作为一种类似互斥锁的机制,这也叫二元信号量,
表示两种互斥状态
5.1、Semaphore 与 ReentrantLock
Semaphore 基本能完成 ReentrantLock 的所有工作,使用方法也与之类似,通过 acquire()与
release()方法来获得和释放临界资源。经实测,Semaphone.acquire()方法默认为可响应中断锁,
与 ReentrantLock.lockInterruptibly()作用效果一致,也就是说在等待临界资源的过程中可以被
Thread.interrupt()方法中断。
此外,Semaphore 也实现了可轮询的锁请求与定时锁的功能,除了方法名 tryAcquire 与 tryLock
不同,其使用方法与 ReentrantLock 几乎一致。Semaphore 也提供了公平与非公平锁的机制,也
可在构造函数中进行设定。
Semaphore 的锁释放操作也由手动进行,因此与 ReentrantLock 一样,为避免线程因抛出异常而
无法正常释放锁的情况发生,释放锁的操作也必须在 finally 代码块中完成