活动介绍

Java多线程ReentrantLock1

preview
需积分: 0 0 下载量 189 浏览量 更新于2022-08-03 收藏 67KB PDF 举报
Java的ReentrantLock是Java并发编程中非常重要的一个同步机制,它是JDK 5.0引入的并发包`java.util.concurrent.locks`中的一个高级锁,提供了比synchronized更细粒度的控制,同时具备更高的灵活性和性能。ReentrantLock的名字来源于其特性——重入性,意味着一个线程可以多次获取同一锁,而不会导致死锁,只要在每次获取锁后正确地释放即可。 **1. 重入锁的概念** 重入锁允许同一个线程在已获得锁的情况下再次请求该锁。例如,一个线程可能在一个同步方法中调用了另一个同样需要该锁的方法,如果没有重入性,这种情况下就会发生死锁。在ReentrantLock中,每次获取锁都会增加一个持有计数,释放锁时会递减这个计数,当计数归零时,锁才真正被释放。 **2. 公平锁与非公平锁** ReentrantLock支持两种模式:公平锁和非公平锁。公平锁按照线程等待的顺序分配锁,保证了等待时间最长的线程优先获取锁;而非公平锁则没有这个限制,线程获取锁的顺序不确定,可能会有线程“插队”获取锁,这可能导致某些线程长时间等待,但非公平锁的效率通常高于公平锁。 **3. 加锁方法** - `lock()`: 这是最常见的加锁方式,如果锁可用,线程会立即获取并返回,否则线程会被阻塞直到获取到锁。 - `tryLock()`: 可以指定等待时间,如果在给定时间内能获取到锁,则返回true,否则返回false。若不指定时间,tryLock会立即返回,如果锁可用则返回true,否则返回false。 - `lockInterruptibly()`: 这个方法创建了一个可中断的锁,当线程在等待获取锁时,如果被中断,会抛出InterruptedException,并释放锁。 **4. 锁状态查询** - `isHeldByCurrentThread()`: 判断当前锁是否被当前线程持有。 - `getHoldCount()`: 获取当前线程持有锁的次数。 - `hasQueuedThread(Thread thread)`: 判断指定的线程是否在锁的等待队列中。 - `hasQueuedThreads()`: 判断锁的等待队列中是否存在任何线程。 **5. Node类与waitStatus** 在ReentrantLock中,等待队列是基于双向链表实现的,每个节点(Node)都有一个waitStatus字段,表示节点的状态。waitStatus有五种可能的值: - CANCELLED(1): 表示节点被取消,不会参与锁的竞争。 - 0: 除了以上四种状态外的其他情况。 - SIGNAL (-1): 当前节点的后继节点被阻塞,需要当前节点释放锁后唤醒后继节点。 - CONDITION (-2): 节点处于某个条件队列中,等待被唤醒。 - PROPAGATE (-3): 用于可传播的节点,确保在某些操作中不会阻塞其他操作。 总结来说,ReentrantLock在Java多线程编程中扮演着关键角色,提供了灵活的锁管理机制,包括公平性和非公平性选择,以及可中断和定时的锁获取方式。了解和熟练掌握ReentrantLock的使用,能够帮助开发者编写出高效、安全的并发程序。
身份认证 购VIP最低享 7 折!
30元优惠券