本文主要是介绍Lock接口和synchronized同步 对比它有什么优势?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Lock接口比同步方法和同步块提供了更具扩展性的锁操作。他们允许更灵活的结构。可以具有完全不同的性质,并且 可以支持多个相关类的条件对象
它的优势有:
1.可以使锁更公平
2. 可以使线程在等待所的时候响应中断
3.可以让线程尝试获取锁,并在无法获取锁的时候立即返回或者等待一段时间
4.可以在不同的范围,一不同的顺序获取和释放锁(lock)
整体上说,Lock是synchronized的扩展版,Lock提供了无条件的,可轮询的(tryLock方法),定时的(tryLock的带参方法),可中断(lockInterruptibly),可多条件队列(newCondition)锁操作。另外Lock的实现类基本都支持非公平锁和公平锁,synchronized只支持非公平锁,当然,大部分情况下,非公平锁是高效的选择
补充
可轮询
可轮询是在多个线程或并发编程中,某个操作或资源可以被反复检查状态来防止线程被阻塞。
Lock具有的更大的扩展性
- Lock 提供了**tryLock()**方法
- 对比synchronized不同,后者一旦进入同步代码块或方法,就会被阻塞,直到获取锁
- 这个方法就是线程只是尝试获取锁,但是不会被阻塞
- 可中断的锁获取->lockInterruptibly()
这个方法允许线程在尝试获取锁的时候能够响应中断请求 - 定时获取锁->trylock(long time,TimeUnit unit)
- 这个方法允许在指定时间内获取锁,如果超出时间,可以选择放弃锁->避免线程长时间等待锁
- 灵活的锁释放
- 使用unlock()方法来释放,比起sychronized中->线程退出同步块/方法 会自由很多
- 读写锁(ReadWriteLock)
- 允许多个线程同时读操作,独占写操作
更灵活的结构
- 使用lock()和unlock()来获取和释放
- Lock是一个接口,ReentrantLock(可重入锁)和ReetrantReaderWriteLock 等,这些不同的实现适用于不同的开发场景,前者提供了可重入 的功能,后者读写分离
- 使用Condition对象支持多个条件变量。也就是说允许为一个锁创建多个条件变量,这样,锁可以通过不同的条件变量的线程
更公平
- 对于公平锁,等待时间最长的线程会优先获取锁
- Lock接口提供了一个接口,可选择公平锁或者非公平锁。所谓公平锁就是按照他们请求锁的顺序来进行的 。但是synchronized默认非公平,线程可能会被随机唤醒来获取锁,从而导致“饥饿”状态(某线程长时间无法获取锁)
这篇关于Lock接口和synchronized同步 对比它有什么优势?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!