【问题标题】:How to use locks to ensure a method is only run a set number of times simultaneously如何使用锁来确保方法只同时运行一定次数
【发布时间】:2013-09-06 18:06:23
【问题描述】:

我知道在 Java 中,要确保每个线程一次只运行一段代码,只需使用 synchronized 关键字。即,

synchronized (getClass()) {
   // expensive work
}

但是,我宁愿只在有足够 RAM 可用的情况下执行昂贵的工作。即,假设我有 10 个线程在运行,并且在代码的 expensive work 部分中,它占用了 50 MB 的 RAM。假设我根据 JVM 可以使用的最大内存进行计算,并意识到我可以安全地同时运行 5 个线程。

那么,我如何正确使用LocksConcurrency.wait()/.notify() 来确保expensive work 仅运行该设定次数?

我希望我的问题是有道理的。我研究了LocksReentrantLock,但实际上我发现这个例子不起作用。在他们的示例中,似乎每个单独的线程都创建了一个 lock 的实例,而在我的情况下,我有多个单独的、独立的线程同时运行并且它们彼此不知道。

谁能举个例子,或者给出一个例子的链接,你使用并发/锁来满足这个场景?

我需要该解决方案与 Java 6 兼容。

【问题讨论】:

    标签: java multithreading concurrency synchronization locking


    【解决方案1】:

    那么,我如何正确使用 Locks 或 Concurrency 或 .wait()/.notify() 来确保昂贵的工作只运行设定的次数?

    Semaphore 是泰勒为这类事情设计的。它有一定数量的许可,除非有许可,否则线程将阻塞。

    引用javadocs

    计数信号量。从概念上讲,信号量维护一组许可。如有必要,每个 acquire() 都会阻塞,直到获得许可,然后再接受它。每个 release() 添加一个许可,可能会释放一个阻塞的获取者。但是,没有使用实际的许可对象; Semaphore 只是对可用数量进行计数并采取相应措施。

    类似下面的代码应该可以工作:

    // only allow 5 threads to do the expensive work at the same time
    private final Semaphore semaphore = new Semaphore(5, true /* fairness */);
    ...
    // this will block if there are already 5 folks doing the expensive work
    semaphore.acquire();
    try {
       doExpensiveWork();
    } finally {
       // always do the release in a try/finally to ensure the permit gets released
       // even if it throws
       semaphore.release();
    }
    

    【讨论】:

    • 太棒了!信号量变量是否应该在父线程中声明(从而产生volatilestatic)?
    • 我会将它设为您要保护的类的私有最终版本。如果您试图保护static 方法,那么它应该是static 到类。您不需要将其设为volatile,我也不会在线程中声明它。类应该保护自己。
    • 如果您想保护一个类的多个实例,那么您还需要将信号量设为静态。
    • 感谢您现在尝试。我这样做是为了帮助动态确定创建int maxThreadsForProcessing = (int) Runtime.getRuntime().maxMemory() / 1024 / 1024 / 70; 的许可数量并立即进行测试
    • 它似乎奏效了!虽然,计算出精确的锁数以将每台机器作为内存中的一个函数将是一门艺术。但我喜欢这个新工具:)
    猜你喜欢
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 2011-09-05
    相关资源
    最近更新 更多