Java并发17:Lock接口与ReentrantLock - 更灵活的锁
引言:synchronized的局限性 在前面的文章中,我们深入学习了synchronized,但它有一些局限性: public class SynchronizedLimitations { private final Object lock = new Object(); public void method() { synchronized (lock) { // 问题1:无法响应中断 // 如果获取锁的线程被阻塞,无法中断它 // 问题2:无法设置超时 // 如果获取不到锁,会一直等待 // 问题3:必须在同一个代码块中释放锁 // 无法在方法A获取,方法B释放 // 问题4:无法尝试非阻塞获取锁 // 无法tryLock() // 问题5:无法实现公平锁 // synchronized是非公平的 } } } JDK 1.5引入Lock接口,解决这些问题: Lock lock = new ReentrantLock(); // 可响应中断 lock.lockInterruptibly(); // 可设置超时 boolean success = lock.tryLock(1, TimeUnit.SECONDS); // 可尝试非阻塞获取 if (lock.tryLock()) { try { // ... } finally { lock.unlock(); } } // 可实现公平锁 Lock fairLock = new ReentrantLock(true); 本篇文章将深入Lock接口和ReentrantLock的实现原理。 ...