我有以下代码
public class Test {
Lock lock = new ReentrantLock();
public static void main(String args[]) throws Exception {
Test t = new Test();
Second second = t.new Second();
second.lock = t.lock;
Thread thread = new Thread(second);
thread.start();
Thread.sleep(2000);
try {
t.lock.lock();
System.err.println("got the lock");
} finally {
second.shutdown = true;
t.lock.unlock();
}
}
private class Second implements Runnable {
Lock lock;
volatile boolean shutdown = false;
int i = 0;
public void run() {
while (!shutdown) {
try {
lock.lock();
System.out.println("In second:" + i++);
} finally {
lock.unlock();
}
}
}
}
}
我读到here有一个公平和不公平锁定的概念,但是使公平锁定具有很大的性能影响,但不应该使上述代码对当前线程有一定的公平性。 在实际执行上面的代码时,第二个线程永远运行(在545342次迭代后为主线程让路)
我在这里做错了吗?任何人都可以解释这种行为吗?
答案 0 :(得分:2)
基本上没有使锁公平,第二个线程正在解锁并设法在第一个线程有机会之前重新获取锁。经过大量的迭代后,它必须在“解锁”和“锁定”之间被抢占,让你的第一个线程有机会进入并停止它。
从根本上说,你根本不应该在第二个线程中有这样的代码 - 在现实生活情况下你想要反复释放并获得一个锁 no 两者之间的工作,除了检查国旗? (如果您做想要这样做,为什么要要求“关闭”线程获取相同的锁以设置标志?)