【发布时间】:2014-07-07 00:07:41
【问题描述】:
我想创建公平锁,以便每个线程一个接一个地获得锁,而不管优先级如何。
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);
当我运行这个演示时,它不会让具有最小优先级的线程执行与具有最大优先级的线程一样多的执行次数。但我认为公平锁就是为了这个。
如何正确使用公平锁?
【问题讨论】:
-
这意味着每个线程被顺序地赋予一个锁,以便每个线程可以运行同步方法相同的次数。
-
@Volodia:这不是文档定义公平性的方式:“当设置为 true 时,在争用情况下,锁定有利于授予对等待时间最长的线程的访问权限。”
-
JIT 不会优化这样的循环吗?
标签: java concurrency reentrantlock