JUC:3_1synchronized锁和Lock锁区别
synchronized锁和Lock锁区别
- synchronized 是Java关键字;Lock 是Java的一个接口
- synchronized 无法判断获取锁的状态;Lock 可以判断是否获取到了锁
- synchronized 执行完或异常会自动释放锁;Lock 必须要手动释放锁,如果不释放就会死锁
- synchronized 如果有两个线程,线程1获得锁后阻塞,线程2也要获得锁,那么线程2就会一直等待;Lock 就不会一直等待,可以tryLock()尝试获取锁
- synchronized 是可重入锁,不可中断的(死等),非公平锁;Lock可重入锁,可以判断锁,默认非公平锁(可以设置)
- synchronized 适合锁少量的同步代码;Lock 适合锁大量的同步代码
可重入锁:
线程一旦获取到了锁,再次进入锁代码块的时候不需要再去争取锁,比如递归的时候,也就是说当这个线程一旦获取到了锁,可以再次获取锁而不会产生死锁。
锁是什么?如何判断锁的是谁?
锁是一个标志位,锁的是对象
Lock锁
java.util.concurrent.locks.Lock(接口)
所有已知实现类:
- ReentrantLock
- ReentrantReadWriteLock.ReadLock
- ReentrantReadWriteLock.WriteLock
Lock实现提供比使用synchronized方法和语句可以获得的更广泛的锁定操作。 它们允许更灵活的结构化,可能具有完全不同的属性,并且可以支持多个相关联的对象Condition 。
Lock惯用语
Lock l = ...; l.lock();
try { // access the resource protected by this lock } finally { l.unlock(); }
返回值 | 方法 | 描述 |
---|---|---|
void | lock() | 获得锁 |
void | lockInterruptibly() | 获取锁定,除非当前线程是 interrupted |
Condition | newCondition() | 返回一个新Condition绑定到该实例Lock实例 |
boolean | tryLock() | 只有在调用时才可以获得锁 |
boolean | tryLock(long time, TimeUnit unit) | 如果在给定的等待时间内是空闲的,并且当前的线程尚未得到 interrupted,则获取该锁 |
void | unlock() | 释放锁 |