我想创建一个公平的锁,以便每个线程都被一个接一个地给予一个锁,而不管优先级如何。如何创建公平的锁解决java中的饥饿?
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);
当我运行这个演示时,它不给线程与最小优先级执行多次的线程与最大优先级。但我认为公平的锁只是为了这个。
如何正确使用公平锁?
定义“公平锁” – alfasin
这意味着每个线程都有一个锁顺序,使每个线程都可以运行同步方法的时间是相同的。 –
@Volodia:那么这不是文档如何定义公平性:“如果设置为true,在争用情况下,锁定允许授予访问最长等待线程的权限。” –