Lock和Synchronized
Lock与Synchronized:
1、Synchronized无法判断是否获取锁的状态,Lock可以判断是否获取锁
2、Lock中的某些锁允许对共享资源的并发访问,如ReadWriteLock读写锁,readLock()获取读锁,writeLock()获取写锁,读锁可以被多个线程获取,写锁只能有一个线程持有。Synchronized锁不允许
3、Synchronized在代码块执行关闭或者出现异常的情况下会自动释放锁,不容易造成死锁,Lock锁需要在finally块中手动释放锁。
4、Lock支持获取锁尝试 tryLock,获取超时失效锁的尝试tryLock(long,TimeUnit),获取可中断锁的尝试lockInterruptibly。Synchronized会一直等待。synchronized是不可中断锁。
5、Lock支持公平锁和非公平锁。Synchronized是非公平锁,无法保证等待的线程获取锁的顺序。公平锁是尽量以请求锁的顺序来获取锁。
6、Lock和Synchronized都是可重入锁,可重入意味着一个线程可以进入任何一个它已经拥有的锁所同步着的代码块而不用重新获取锁。
7、因此Lock锁适合大量同步的代码的同步问题,Synchronized锁适合少量代码的同步问题
ReentrantLock与Synchronized:
ReentrantLock | Synchronized | |
灵活性 | 支持响应中断、超时、尝试获取锁 | - |
锁类型 | 公平锁&非公平锁 | 非公平锁 |
条件队列 | 可关联多个条件队列 | 关联一个条件队列 |
锁实现机制 | 依赖AQS | 监视器模式 |
可重入性 | 可重入 | 可重入 |
释放形式 | 必须显示调用unlock()释放锁 | 自动释放监视器 |