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

时间:2014-05-19 06:17:23

标签: java concurrency reentrantlock

我想创建公平锁定,以便每个线程都被一个接一个地锁定,而不管优先级如何。

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();
        }
    }
}

所以我有4个帖子。 3具有最高优先级,1具有最小优先级。

我创造了公平的锁定
new ReentrantLock(true);

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

如何正确使用公平锁定?

2 个答案:

答案 0 :(得分:9)

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

  

此类的构造函数接受可选的fairness参数。当设置为true时,在争用下,锁有利于授予对等待时间最长的线程的访问权。

另一方面,线程优先级是本机线程调度程序的提示,以便为高优先级线程提供比低优先级线程更多的CPU时间,如果它们竞争获得CPU时间的话。

答案 1 :(得分:0)

我使用java wait()notify()框架创建了一个示例实现。无论线程优先级如何,它都提供基于先到先服务(FCFS)的锁定。

您可以查看https://github.com/nenapu/JavaLocks

处的公平锁定实施情况