为什么以下代码会导致线程争用

时间:2011-11-30 07:24:04

标签: java multithreading locking

我有以下代码

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次迭代后为主线程让路)

我在这里做错了吗?任何人都可以解释这种行为吗?

1 个答案:

答案 0 :(得分:2)

基本上没有使锁公平,第二个线程正在解锁并设法在第一个线程有机会之前重新获取锁。经过大量的迭代后,它必须在“解锁”和“锁定”之间被抢占,让你的第一个线程有机会进入并停止它。

从根本上说,你根本不应该在第二个线程中有这样的代码 - 在现实生活情况下你想要反复释放并获得一个锁 no 两者之间的工作,除了检查国旗? (如果您想要这样做,为什么要要求“关闭”线程获取相同的锁以设置标志?)