当前位置: 首页 > 知识库问答 >
问题:

如何写一个简单的公平锁?

廖招
2023-03-14

如何写一个简单的公平锁模拟新的ReentantLock(真)

     public class Main1 {

    public static void main(String[] args) {
//      Lock lock = new ReentrantLock(true);
        CustomLock lock = new CustomLock();
        new Thread(new Producer(lock)).start();
        new Thread(new Consumer(lock)).start();
    }
}

class Producer implements Runnable {
    private Lock lock;
    private CustomLock customLock;

    public Producer(Lock lock) {
        this.lock = lock;
    }

    public Producer(CustomLock lock) {
        this.customLock = lock;
    }

    @Override
    public void run() {
        while (!Thread.currentThread().isInterrupted()) {
//          lock.lock();
            customLock.lock();
            System.out.println("Producer before");
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Producer after");
//          lock.unlock();
            customLock.unlock();
        }
    }
}

class Consumer implements Runnable {
    private Lock lock;
    private CustomLock customLock;

    public Consumer(Lock lock) {
        this.lock = lock;
    }

    public Consumer(CustomLock lock) {
        this.customLock = lock;
    }

    @Override
    public void run() {
        while (!Thread.currentThread().isInterrupted()) {
//          lock.lock();
            customLock.lock();
            System.out.println("Consumer before");
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Consumer after");
//          lock.unlock();
            customLock.unlock();
        }
    }
}

class CustomLock{
    private boolean isLocked;

    public synchronized void lock(){
        while (isLocked) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        isLocked = true;
    }

    public synchronized void unlock(){
        if(isLocked){
            isLocked = false;
            notify();
        }
    }
}

定义不公平锁(我不确定它是否正确)

class CustomLock{
    private boolean isLocked;

    public synchronized void lock(){
        while (isLocked) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        isLocked = true;
    }

    public synchronized void unlock(){
        if(isLocked){
            isLocked = false;
            notify();
        }
    }
}

共有1个答案

蔚丰
2023-03-14

如果您想要一个公平锁,您需要使用一个列表,并按照列表顺序通知线程。

 类似资料:
  • 问题内容: 我一直在努力写两个管道函数,一个可以编译较少的文件,另一个可以合并这些文件。我想学习如何为更复杂的插件编写转换流/管道。 因此,我想知道如何从另一个管道读取数据,以及如何更改该数据并将其发送到下一个管道。这是我到目前为止的内容: 我无法在第二个管道中获得每个文件的。如何发送? 问题答案: 嗯,您不需要在这里使用,您已经获得了文件流(在此处)。 还有一点,您没有将文件发送回管道,所以我想

  • You are the light of the world. A city located on a hill cannot be hidden. People do not light a lamp and put it under a basket but on a lampstand, and it gives light to all in the house. In te same w

  • 问题内容: 我对学习数据库引擎的工作方式(即它的内部)感兴趣。我知道CS中讲授的大多数基本数据结构(树,哈希表,列表等),以及对编译器理论的很好理解(并实现了一个非常简单的解释器),但我不知道该怎么做关于编写数据库引擎。我已经搜索了有关该主题的教程,但找不到任何教程,因此我希望其他人可以向我指出正确的方向。基本上,我想了解以下信息: 数据如何在内部存储(即表的表示方式等) 引擎如何查找所需的数据(

  • 本文向大家介绍使用Django简单编写一个XSS平台的方法步骤,包括了使用Django简单编写一个XSS平台的方法步骤的使用技巧和注意事项,需要的朋友参考一下 1) 简要描述 原理十分简单2333,代码呆萌,大牛勿喷 >_< 2) 基础知识 XSS攻击基本原理和利用方法 Django框架的使用 3) Let's start 0x01 工欲善其事必先利其器,首先我们需要准备编写代码的各种工具和环境,

  • 本文向大家介绍如何简单的实现一个promise?相关面试题,主要包含被问及如何简单的实现一个promise?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 首先明确什么是promiseA+规范,参考规范的地址:primise A+规范 如何实现一个promise,参考我的文章: 实现一个完美符合Promise/A+规范的Promise 一般不会问的很详细,只要能写出上述文章中的v1.0版本

  • 问题内容: 我正在寻找一个简单的功能,可以从instagram评论中删除表情符号字符。我现在已经尝试过的内容(带有在SO和其他网站上找到的示例中的许多代码): 任何帮助,将不胜感激 问题答案: 我认为preg_replace函数是最简单的解决方案。 正如EaterOfCode所建议的那样,由于没有SO(或其他网站)答案似乎适用于Instagram照片标题(API返回格式),因此我阅读了Wiki页并