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位为写