首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何创建公平的锁来解决java中的饥饿问题?

如何创建公平的锁来解决java中的饥饿问题?
EN

Stack Overflow用户
提问于 2014-05-19 06:17:23
回答 2查看 9.5K关注 0票数 2

我想要创建公平的锁,这样每个线程都会被一个接一个地锁,而不管优先级如何。

代码语言:javascript
运行
复制
import java.util.concurrent.locks.ReentrantLock;

public class StarvationRunnable implements Runnable {

    private ReentrantLock lock = new ReentrantLock(true);

    public void doLongTask() {
        lock.lock();
        // to imitate long running task in critical section
        for (int i = 0; i < 1000000000; i++)
            ;
        System.out.println(Thread.currentThread().getName() + " is running with priority "
                + Thread.currentThread().getPriority() + " !");
        lock.unlock();
    }

    @Override
    public void run() {
        for (;;) {
            doLongTask();
        }
    }

    public static void main(String[] args) {
        StarvationRunnable runnable = new StarvationRunnable();

        for (int i = 0; i < 4; i++) {
            Thread thread = new Thread(runnable);
            thread.setPriority(i == 3 ? Thread.MIN_PRIORITY : Thread.MAX_PRIORITY);
            thread.start();
        }
    }
}

所以我有四条线。最大优先级3次,最小优先级1次。我创造了公平的锁

代码语言:javascript
运行
复制
new ReentrantLock(true);

当我运行这个演示时,它不会给具有最小优先级的线程执行最多优先级线程的次数。但我认为公平的锁只是为了这个。

如何正确使用公平锁?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-19 06:21:40

公平性与线程优先级无关。javadoc说:

这个类的构造函数接受一个可选的公平参数。当设置为true时,在争用项下,锁倾向于授予对等待时间最长的线程的访问权限。

另一方面,线程优先级是本机线程调度程序的提示,以便在竞争获得CPU时间的情况下,给予高优先级线程比低优先级线程更多的CPU时间。

票数 10
EN

Stack Overflow用户

发布于 2017-01-23 18:56:01

我使用java wait()notify()框架创建了一个示例实现。它提供基于先到先得(FCFS)的锁,而不考虑线程优先级。

您可以查看https://github.com/nenapu/JavaLocks的公平锁实现

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23730834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档