優先度に関係なく、各スレッドに次々とロックが与えられるように、公平なロックを作成したいと考えています。
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);
このデモを実行すると、最小優先度のスレッドが最大優先度のスレッドと同じ回数実行されることはありません。でもフェアロックはそのためだと思います。
フェアロックの正しい使い方は?