Lock锁
ReentrantLock vs synchronized
- synchronized内置java关键字。Lock是一个java类
- synchronized无法判断获取锁的状态,Lock可以判断是否获得到了锁
- synchronized会自动释放锁,lock锁必须要手动释放,如果不释放会死锁。
- synchronized线程1获得锁(一直不释放锁),线程2傻傻的等。lock锁tryLock就不一定一直等待。【trylock有两种用法,一种是不带参数:不设置等待时间,获取失败立即返回false。另一种是带等待时间的,线程会先挂起等待设置的时间结束如果还未获取到锁则返回false】
- synchronized可重入锁,非公平。lock可重入锁,可以判断锁,可以是公平锁。
- synchronized适合少量的代码同步问题,lock适合大量的同步代码。
- 在竞争不是很激烈的情况下,也就是线程数量比较少的情况下,sychornized的性能要优于lock,但是在竞争很激烈的情况下 。 sychornized的性能会下降,lock的性能能维持常态。
- lock只能锁代码块;synchronized可以锁代码块+方法锁
public class ReentrantLockTest { public static void main(String[] args) { Lock lock = new ReentrantLock(); try { lock.lock(); } finally { lock.unlock(); } } }
Condition VS synchronized
Condition精准的通知和唤醒线程。
线程通信-生产者消费者模式-【测试1-Condition VS synchronized】
彻底理解锁
- 对于普通同步方法,锁是当前实例对象
- 对于静态同步方法,锁是当前类的Class对象
- 对于同步方法块,锁是synchronized括号里配置的对象