Java并发编程——锁

lock与synchronized的异同点?

相同点:

lock与synchronized都是保护线程资源的安全

可保证可见性

都具有重入性

不同点:

lock比同步方法同步块对锁有较高的延展性,有灵活的操作空间

1.可以让锁更加公平

2.可以获取锁的时候,中断响应

3.可以在不同范围内释放和获取锁

4.可以让在等待锁的时候,自行离开或者等待

lock与AQS的关系?

lock是面向锁的使用者的,他实现了使用者和锁之间的关系接口,隐藏了实现细节。AQS是面向锁的实现者的,他简化了锁的实现机制,屏蔽了锁的同步状态管理,线程的排队,等待和唤醒等底层操作。他们很好隔离了使用者和实现者所关注的领域

什么是可重入,什么是可重入锁?

可重入锁的意思就是自己可以获得自己的内部锁,比说就是一个线程去获取到另一个对象中的锁,如果该锁没有释放的话,我们可以等下一次来的时候再获取该对象的锁,如果没有可重入性,那么就会造成死锁。同一个线程每获取到锁,锁的计数器就会加1,等到计数器为0的时候,他就会释放。

为什么非公平锁比公平锁的效率更好?

先来说一下他们的机制,公平锁呢,获取锁时,是先将自己添加在等待队列的对位进行休眠,等到锁释放的时候,等待队列的队首唤醒,去尝试获取锁,如果获取到锁后,又进入了休眠,就这样不停的转换,所以性能不好。

而公平锁是获取锁时,先尝试获取锁,如果获取成功就直接得到锁,如果获取不到,就进去同步队列等待下一次重新获取锁,这样效率是比较高的

ReentrantLock是如何实现公平锁的?非公平锁的?

ReentrantLock类内部共有三个类,Sync,FairSync,NonFairSync这三个类,FairSync,NonFairSync继承自Sync

他们两个区别其实就是,非公平锁是使用NonFairSync使用父类的的方法tryAcquire方法,而公平锁的就是在里面判断条件加了一个hasQueuedPredecessors()方法,这个方法就是判断当年节点是否存在前驱节点。如果有就返回true,这说明前面有比该线程申请早的,所以要等待。这就是公平

ReentrantLock和Synchronized的对比?

相同点:

都是保护线程资源的安全

都保证了可见性

都具有可重入的特性

不同点:

ReentrantLock相对于Synchronized有较高的灵活性,Syschronized是加锁和解锁其实是JVM来实现的,而ReentrantLock需要手动控制,lock和unlock。还有就是Syschronized是只允许一个线程获取锁的,当这个线程获取锁之后,其他线程就只能等待,只能进入堵塞状态,知道这个线程释放这个锁,才能获取,有可能会等很长时间,而ReentrantLock可以使用lockInterruptibly方法,这个方法可以不想等待的时候就不等可以使用trylock去获取锁。更加灵活。

Synchronized锁只能被一个线程获取,而lock没有这个现状。

lock还可以设置公平锁和非公平锁,Synchronized是默认为非公平锁

ReentrantReadWritelock是什么?

他是一个支持可重入的读写锁,提高了多线程读取的效率,也保证了写入数据的安全。

他其实是有两种锁,一种是读锁Readlock,另一种是写锁Writelock

读是共享锁,而写是独占锁,读锁可以被多个线程一起获取,而写锁一次只能一个线程

线程持有写锁还能有获取读锁吗?

当线程持有写锁时,是可以获取读锁,因为线程获取读锁的时候写锁被占用,没有占用时才会失败

当线程持有读锁时,不可以获取写锁,因为线程被读锁占用

什么时锁的升降级,ReentrantReadWritelock为什么不能锁升降级

写锁可以降级为读锁,而读锁不可以升级为写锁,因为写锁为独占锁,会引发线程的争斗而且会影响性能还有可能造成死锁。

,ReentrantReadWriteLock底层读写状态如何设计的?

高16位为读,低16位为写

  • 16
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值