java并发面试复习
1synchronized和ReentranLock的区别
共同点:
a. 都是用来协调多线程对共享对象,变量的访问
b.都是可重入锁,同一线程可以多次获得同一个锁
c. 都保证了互斥性和可见性
不同点:
a.ReentranLock显示的获得,释放锁,synchronized隐式获得释放锁
b.ReentranLock是API级别的,synchroized是JVM级别的
c.ReentranLock是可以实现公平锁的
d.底层实现不一样,synchronized是同步阻塞的,使用的是悲观并发策略,lock是同步非阻塞的,采用的乐观并发策略
e.synchronized在发生异常的时候,会主动释放线程占有的锁,因此不会导致死锁的现象发生,Lock在发生异常的时候,如果没有主动通过unLock方法释放,则很可能造成死锁的现象,因此在使用的时候需要在finally中进行释放锁
f.Lock可以知道有没有成功获取到锁,但是synchronized是无法知道是否成功获取到锁
g.Lock可以读写锁的实现,可以提高线程的工作效率,但synchronized是不能实现的
2.condition类和Object类锁方法的区别
1.condition类中await方法和object的wait方法等效
2.condition类中signal方法和object的notify方法等效
3.condition类中signalAll方法和object的notifyAll方法等效
4.Lock类可以唤醒指定条件的线程,而Object的唤醒是随机的