我有以下代码
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次迭代后让位于主线程)
我是不是做错了什么?有人能解释这种行为吗?
发布于 2011-11-30 15:30:04
基本上,在没有使锁公平的情况下,第二个线程正在解锁,并设法在第一个线程有机会之前重新获取锁。在你的大量迭代之后,它必须在"unlock“和"lock”之间被抢占,给你的第一线程一个进入并停止它的机会。
但从根本上说,你不应该在第二个线程中有这样的代码-在什么实际情况下,你想重复释放和获取一个锁,在两者之间不做任何工作,除了检查一个标志?(如果您确实想要这样做,为什么要要求“关闭”线程获得相同的锁才能设置标志?)
https://stackoverflow.com/questions/8322452
复制相似问题