java 多线程: Thread 锁ReentrantLock 常用方法

注意

reentrantLock 和 同步代码块儿一样,同一个时刻只能一个线程获取锁,也就是共用锁的代码块部分,线程是顺序执行的

ReentrantLock 常用方法

  1. getHoldCount获取当前线程被锁定的次数,如果调用unlock,锁定次数会减去1:
  2. lock.getQueueLength()  等待获取该锁的线程的个数
  3. lock.getWaitQueueLength(condition) 获取某个lock下的所有condition被调用await的个数,也就是暂停状态等待被唤醒的线程个数。
  4. lock.hasQueuedThread(t2) 判断某个线程是否正在等待该锁
  5. lock.hasWaiters(condition) 判断是否有线程用了本锁下面的Condition await等待中
  6. isFair():判断当前锁是不是公平锁
  7. isHeldByCurrentThread():判断该锁是否锁定了当前线程
  8. isLocked():判断该锁是否锁定了任意一个线程
  9. tryLock(long timeOut, TimeUtil timeUtil):该锁如果在规定的时间内没有被其他线程占有,那么直接对当前线程加锁
  10. Condition.awaitUninterruptibly():在某个线程中使用Condition的await方法之后直接调用thread.interrupt()方法会报错。但是如果我们使用awaitUninterruptibly方法依然会起到等待的作用,但是在调用thread.interrupt()方法不会报错
  11. condition.awaitUntil(Date deadline) 在等待时间之内可以被其它线程唤醒,等待时间一过该线程会自动唤醒,和别的线程争抢锁资源,只不过这里设置的是一个到期的具体时间。用法和condition.wait(long)没有任何区别

3、查看对应condition.await()状态的线程个数  lock.getWaitQueueLength(condition)

复制代码
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @ClassName getAwaitCount
 * @projectName: object1
 * @author: Zhangmingda
 * @description: XXX
 * date: 2021/4/25.
 */
public class ReentrantLockgetAwaitCount {
    public static void main(String[] args) throws InterruptedException {
        ReentrantLock lock = new ReentrantLock();
        Condition condition = lock.newCondition();
        Runnable r = () -> {
            lock.lock();
            try {
                condition.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        };
        List<Thread> threads = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            threads.add(new Thread(r));
        }
        threads.forEach(thread -> thread.start());
        Thread.sleep(2000);
        lock.lock();
        System.out.println("目前有" + lock.getWaitQueueLength(condition) + "个线程执行了对应的condition的await方法"); //目前有10个线程执行了对应的condition的await方法
        condition.signalAll();
        System.out.println("目前有" + lock.getWaitQueueLength(condition) + "个线程执行了对应的condition的await方法"); //目前有0个线程执行了对应的condition的await方法
        lock.unlock();
    }
}
复制代码

 

4、判断某个线程是否正在等待该锁 lock.hasQueuedThread(t2)

示例代码:

复制代码
import java.util.concurrent.locks.ReentrantLock;

/**
 * @ClassName ReentrantLockWaitLockOrNot
 * @projectName: object1
 * @author: Zhangmingda
 * @description: XXX
 * date: 2021/4/25.
 */
public class ReentrantLockWaitLockOrNot {
    public static void main(String[] args) throws InterruptedException {
        ReentrantLock lock = new ReentrantLock();
        Runnable r = () -> {
            lock.lock();
            try {
                Thread.sleep(Integer.MAX_VALUE);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        };
        Thread t1 = new Thread(r);
        Thread t2 = new Thread(r);
        t1.start();
        Thread.sleep(1000);
        t2.start();
        Thread.sleep(1000);
        System.out.println(lock.hasQueuedThread(t2)); //true
    }
}
复制代码

5、判断是否有线程在对应锁的waiter暂停状态中 lock.hasWaiters(condition)

复制代码
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @ClassName ReentrantLockHasWaiters
 * @projectName: object1
 * @author: Zhangmingda
 * @description: XXX
 * date: 2021/4/25.
 */
public class ReentrantLockHasWaiters {
    public static void main(String[] args) throws InterruptedException {
        ReentrantLock lock = new ReentrantLock();
        Condition condition = lock.newCondition();
        Runnable r = () -> {
            lock.lock();
            try {
                condition.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        };
        Thread t1 = new Thread(r);
        t1.start();
        Thread.sleep(1000);
        lock.lock();
        System.out.println(lock.hasWaiters(condition)); //true
        condition.signal();
        Thread.sleep(1000);
        System.out.println(lock.hasWaiters(condition)); //false
        lock.unlock();
    }
}
复制代码

 

posted on   zhangmingda  阅读(320)  评论(0编辑  收藏  举报

编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2020-04-25 js中let和var定义变量的区别
2020-04-25 javascript中的12种循环遍历方法
2020-04-25 JavaScript 定时器
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示