在Java中,Lock
是一个接口,用于控制多个线程对共享资源的访问。它通常被用于实现同步操作。Java中的 java.util.concurrent.locks.Lock
接口提供了比内置的 synchronized
关键字更广泛的锁定操作。Lock
的实现提供了更高的灵活性,允许更复杂的锁定需求。
Lock
的主要方法是 lock()
和 unlock()
。一般使用在 try-finally
块中以确保在释放锁的时候不会出现异常。
示例:
Lock lock = ...; // 获取Lock对象
lock.lock(); // 阻塞,直到获取锁
try {
// 访问或修改共享的可变数据
} finally {
lock.unlock(); // 解锁,如果不放在finally块中,如果try中抛出异常,锁可能永远不会被释放
}
此外,Lock
接口还提供了尝试获取锁但立即返回的方法(tryLock()
),以及尝试获取锁但只等待一段指定时间的方法(tryLock(long time, TimeUnit unit)
)。
为什么使用 Lock
而不用 synchronized
?因为 Lock
提供了更高的灵活性。比如,你可以尝试获取锁,而不是永久等待,你可以响应中断,你可以尝试获取定时锁等。此外,通过分开获取锁和访问对象,可以提高并发性,因为获取锁的操作可以被设计为不会阻塞其他线程(例如,使用读写锁)。
在 java.util.concurrent.locks
包中,有几个 Lock
的实现,包括 ReentrantLock
(可重入锁),ReentrantReadWriteLock
(可重入读写锁)等。这些锁满足了不同的线程同步需求。