简述ReentrantLock 是如何实现可重入性的?
参考答案:
ReentrantLock
是 Java 中的一个可重入锁,它允许多个线程同时持有锁,只要这些线程是同一个线程。这是通过内部使用一个称为 "锁持有计数" 的机制来实现的。
当一个线程首次获得 ReentrantLock
时,锁持有计数被设置为 1。如果同一个线程再次请求获得这个锁,锁持有计数就会增加,而不是再次等待锁的释放。只有当前线程释放锁时(通过 unlock()
方法),锁持有计数才会减少。当锁持有计数为 0 时,表示锁已经被完全释放,可以被其他线程获取。
这种机制使得 ReentrantLock
成为可重入的,即同一个线程可以多次获得同一个锁,而不会被阻塞。这在某些情况下非常有用,比如当我们在实现递归算法或需要在同一线程中多次访问共享资源时。
需要注意的是,ReentrantLock
还支持公平锁和非公平锁。公平锁保证等待时间最长的线程将获得锁,而非公平锁则允许插队现象,即新来的线程可能会立即获得锁,而不管等待时间的长短。这两种策略的选择取决于具体的应用场景和需求。