文章目录
并发编程面试文章地址链接
内容 | 博客链接 |
---|---|
并发编程面试题之常见面试题 | https://blog.csdn.net/weixin_38251871/article/details/104658674 |
并发编程面试题之 volatile 关键字 |
https://blog.csdn.net/weixin_38251871/article/details/104667384 |
并发编程面试题之 CAS |
https://blog.csdn.net/weixin_38251871/article/details/104667406 |
并发编程面试题之锁 | https://blog.csdn.net/weixin_38251871/article/details/104667392 |
并发编程面试题之阻塞队列 | 待完成… |
并发编程面试题之 AQS |
待完成… |
并发编程面试题之线程池 | 待完成… |
并发编程面试题之 synchronized 和 ReentrantLock 的区别 |
https://blog.csdn.net/weixin_38251871/article/details/104667532 |
并发编程面试题之 CyclicBarrier、CountDownLatch、Semaphore |
待完成… |
并发编程面试题之 ConcurrentHashMap |
https://blog.csdn.net/weixin_38251871/article/details/104667433 |
并发编程面试题之 synchronized 实现原理 |
https://blog.csdn.net/weixin_38251871/article/details/104667415 |
相同点
- 都是协调多线程对共享资源的访问
- 都是可重入锁, 同一个线程可以多次获得同一个锁
- 都保证了可见性和互斥性
不同点
ReentrantLock
是类, 而synchronized
是和if、else、for、while
等关键字是一样的, 是内置语言的实现, 这是本质上的区别ReentrantLock
可以在创建锁的时候选择是否创建公平锁, 而synchronized
只能创建非公平锁ReentrantLock
是API
级别的, 而synchronized
是JVM
级别的ReentrantLock
可以显示的获取锁和释放锁, 而synchronized
只能隐式的获取锁ReentrantLock
是类, 提供了比synchronized
更多更灵活的特性【例:可响应中断、可轮回
】, 为处理锁的不可用性提高了灵活性ReentrantLock
底层采用的是同步非阻塞 -乐观并发策略
, 而synchronized
采用的是同步阻塞 -悲观并发策略
ReentrantLock
可以获取锁的信息, 而synchronized
不可以ReentrantLock
可以对获取锁的等待时间进行设置, 这样可以防止出现死锁, 而synchronized
不可以ReentrantLock
可以提高多个线程进行读操作的效率【例:ReentrantReadWriteLock
】ReentrantLock
在异常发生的时候, 如果没有主动通过Lock#unlock()
方法去释放锁, 可能会造成死锁的现象, 所以在使用ReentrantLock
的时候需要在finally
代码块中释放锁资源, 而synchronized
在发生异常的时候会自动地释放锁资源ReentrantLock
还可以通过Condition
类绑定多个条件【注:Condition
的await()/signal()/signalAll()
与Object
的wait()/notify()/notifyAll()
差不多 】