当前位置: 首页 > 面试题库 >

可以增加的闩锁

茹展鹏
2023-03-14
问题内容

有谁知道是否有任何执行以下操作的闩锁实现:

  • 有一种减少锁存器值的方法,或者如果该值为零则等待
  • 具有等待锁存器值为零的方法
  • 具有将数字添加到锁存器值的方法

问题答案:

除了从AQS开始,您可以使用下面的简单实现。它有些天真(它是同步的,而AQS是无锁算法),但是除非您希望在满足条件的情况下使用它,否则它可能已经足够好了。

public class CountUpAndDownLatch {
    private CountDownLatch latch;
    private final Object lock = new Object();

    public CountUpAndDownLatch(int count) {
        this.latch = new CountDownLatch(count);
    }

    public void countDownOrWaitIfZero() throws InterruptedException {
        synchronized(lock) {
            while(latch.getCount() == 0) {
                lock.wait();
            }
            latch.countDown();
            lock.notifyAll();
        }
    }

    public void waitUntilZero() throws InterruptedException {
        synchronized(lock) {
            while(latch.getCount() != 0) {
                lock.wait();
            }
        }
    }

    public void countUp() { //should probably check for Integer.MAX_VALUE
        synchronized(lock) {
            latch = new CountDownLatch((int) latch.getCount() + 1);
            lock.notifyAll();
        }
    }

    public int getCount() {
        synchronized(lock) {
            return (int) latch.getCount();
        }
    }
}

注意:我尚未对其进行深入测试,但它的行为似乎与预期的一样:

public static void main(String[] args) throws InterruptedException {
    final CountUpAndDownLatch latch = new CountUpAndDownLatch(1);
    Runnable up = new Runnable() {
        @Override
        public void run() {
            try {
                System.out.println("IN UP " + latch.getCount());
                latch.countUp();
                System.out.println("UP " + latch.getCount());
            } catch (InterruptedException ex) {
            }
        }
    };

    Runnable downOrWait = new Runnable() {
        @Override
        public void run() {
            try {
                System.out.println("IN DOWN " + latch.getCount());
                latch.countDownOrWaitIfZero();
                System.out.println("DOWN " + latch.getCount());
            } catch (InterruptedException ex) {
            }
        }
    };

    Runnable waitFor0 = new Runnable() {
        @Override
        public void run() {
            try {
                System.out.println("WAIT FOR ZERO " + latch.getCount());
                latch.waitUntilZero();
                System.out.println("ZERO " + latch.getCount());
            } catch (InterruptedException ex) {
            }
        }
    };
    new Thread(waitFor0).start();
    up.run();
    downOrWait.run();
    Thread.sleep(100);
    downOrWait.run();
    new Thread(up).start();
    downOrWait.run();
}

输出:

IN UP 1
UP 2
WAIT FOR ZERO 1
IN DOWN 2
DOWN 1
IN DOWN 1
ZERO 0
DOWN 0
IN DOWN 0
IN UP 0
DOWN 0
UP 0


 类似资料:
  • 本文向大家介绍topic的分区数可不可以增加?如果可以怎么增加?如果不可以,那又是为什么?相关面试题,主要包含被问及topic的分区数可不可以增加?如果可以怎么增加?如果不可以,那又是为什么?时的应答技巧和注意事项,需要的朋友参考一下 可以增加 bin/kafka-topics.sh --zookeeper localhost:2181/kafka --alter --topic topic-co

  • 我试图理解和之间的区别。 如果我正确理解了这个答案,只能减少dataframe的分区数量,如果我们尝试增加分区数量,那么分区数量将保持不变。 但当我试图执行下面的代码时,我发现了两件事 对于合并的Dataframe,可以增加分区数 对于Rdd,如果Shuffle=false,那么分区的数量不能随着合并而增加。 这是否意味着使用合并数据帧分区可以增加? 当我执行以下代码时: 我得到以下输出 当我执行

  • 我按照ActionBarDraw切换指南 我知道如何在操作栏上使用抽屉管理器来显示抽屉图标。 公共ActionBarDrawerToggle(活动Activity,DrawerLayout DrawerLayout,int drawerImageRes,int openDrawerContentDescRes,int closeDrawerContentDescRes) 主办抽屉布局的活动 用于链

  • 我有两个包裹: 2.: 这里有一个的实例,我想向它注册一个新的对象。 显然这是行不通的,因为中不可见。我的直觉是在中创建一个新接口,它扩展了并且是公共的: 但我得到一个: 当我将的可见性更改为public时,它工作得很好,所以我怀疑Java不喜欢增加子接口中接口的可见性。为什么这行不通,如何解决?

  • 在PyCharm中,终端的最大宽度似乎为265个字符。 要查看这一点,请在PyCharm终端中的python提示符下运行以下命令: PyCharm中是否有增加线宽限制的设置? 我想打印出比这更长的行,以与其他程序的输出进行比较。 我意识到我可以将Python的输出写到一个文件中,但是为了快速调试,打印到终端上通常更方便。

  • 问题内容: 我正在编写一个自动化测试程序,该程序将测试某些Web程序,这些程序有时加载某些AJAX调用的速度很慢。例如,用户将单击“查询”,这将在15到90秒的任何时间产生HTML“加载”叠加。搜索完成后,它将使用结果更新同一页面上的表。 所以很明显我可以像这样单独增加等待时间: 但是有没有办法修改(在我的情况下增加)时间,因此Watir-Webdriver 总是 等待90秒,如下所示: 请注意以