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默认非公平,线程可能会被随机唤醒来获取锁,从而导致“饥饿”状态(某线程长时间无法获取锁)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值