线程安全的锁

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

我们利用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 @ 2023-08-01 10:05  IT知识生产小店铺  阅读(5)  评论(0编辑  收藏  举报