在Java多线程编程中,我们经常过加锁的机制来保证线程同步。以Synchronized关键字为实现方式的监视器锁和ReentrantLock的多线程API是我们经常使用的两种方式,那么如何在两者之间进行选择呢?
ReentrantLock的API实现了以下这些特性,而这些特性使用监视器锁实现起来比较复杂:
定时锁:索取锁的时候可以设定一个超时时间,如果超过这个时间还没索取到锁,则不会继续堵塞而是放弃此次任务。
可中断锁:能够在获得锁的同时保持对中断的响应。
锁轮询:只有在锁可以获取的情况下才获取锁,否则返回false给调用者。
非块结构锁:在一个方法中加锁,在另一个方法中释放锁。
公平锁:多个线程在等待同一个锁时,必须按照申请锁的时间顺序排队等待,而非公平锁则不保证这点,在锁释放时,任何一个等待锁的线程都有机会获得锁。
多条件绑定:使用一个锁就可以同多个条件进行关联,而不是使用多个锁。
很明显,当在编程当中碰到以上这些需求点时,优先使用ReentrantLock API就值得重点考虑。但这并不是说监视器锁并不能实现这些需求,毕竟API只是简化了编程的难度。