JUC_锁

JUC中锁的底层使用的就是AQS

  1. ReentrantLock:Lock接口的实现类,可重入锁。相当于synchronized同步锁。

  2. ReentrantReadWriteLock:ReadWriteLock接口的实现类。类中包含两个静态内部类,ReadLock读锁、WriteLock写锁。

  3. Condition:是一个接口,都是通过lock.newCondition()实例化。属于wait和notify的替代品。提供了await()、signal()、singnalAll()与之对应。

  4. LockSupport:和Thread中suspend()和resume()相似。

1. synchronized和lock的区别(面试题)

1.类型不同

synchronized是关键字。修饰方法,修饰代码块

Lock是接口

2.加锁和解锁机制不同

synchronized是自动加锁和解锁,程序员不需要控制。

Lock必须由程序员控制加锁和解锁过程,解锁时,需要注意出现异常不会自动解锁

3.异常机制

synchronized碰到没有处理的异常,会自动解锁,不会出现死锁。

Lock碰到异常不会自动解锁,可能出现死锁。所以写Lock锁时都是把解锁放入到finally{}中。

4.Lock功能更强大

Lock里面提供了tryLock()/isLocked()方法,进行判断是否上锁成功。synchronized因为是关键字,所以无法判断。

5.Lock性能更优

如果多线程竞争锁特别激烈时,Lock的性能更优。如果竞争不激烈,性能相差不大。

6.线程通信方式不同

synchronized 使用wait()和notify()线程通信。

Lock使用Condition的await()和signal()通信。

7.暂停和恢复方式不同

synchronized 使用suspend()和resume()暂停和恢复,这俩方法过时了。

Lock使用LockSupport中park()和unpark()暂停和恢复,这俩方法没有过时。

 

ReadWriteLock: ReadLock 读锁,又称为共享锁。允许多个线程同时获取该读锁 WriteLock 写锁,又称为独占锁。只有一个线程能获取,其他写的线程等待,避免死锁

LockSupport是Lock中实现线程暂停和线程恢复。suspend()和resume()是synchronized中的暂停和恢复。 * 暂停恢复不会释放锁,避免死锁问题

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值