线程安全的锁

如何实现让一个线程执行对资源的锁的分配和占用,执行完一个线程后再执行下一个线程。

我们利用LinkedBlockDeque实现资源的分配。

复制代码
  
// 双向阻塞链表定义有界容量为1
 private static LinkedBlockingDeque<Integer> deque = new LinkedBlockingDeque<>(1);
    public static void main(String[] args) {
       
        CountDownLatch countDownLatch = new CountDownLatch(1);  
        int count = 5;
        for (int i = 0; i < count; i++) {
            int num = i;
            new Thread(()->{
                try {
                    countDownLatch.await();
                    // 从量表尾部添加一个元素,可能会阻塞等待空间有余量
                    deque.put(1);
                    System.out.println("加锁。"+num);
                    // 删除链表尾部的元素。
                    deque.takeLast();
                    System.out.println("解锁。"+num);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }).start();
        }
        countDownLatch.countDown();
    }


    public void putElement(int num) throws InterruptedException {
        deque.put(1);
        System.out.println("加锁。"+num);
        deque.takeLast();
        System.out.println("解锁。"+num);
    }
复制代码

1.因为LinkedBlockDeque的put方法可能发生阻塞,当容量不足时,等待容量被释放。所以在等待的时间内,有一个线程使用了指定资源。

测试发现:

 

posted @   IT知识生产小店铺  阅读(9)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示