gpt4 book ai didi

java - 为什么下面的代码会导致线程争用

转载 作者:行者123 更新时间:2023-11-30 04:56:41 25 4
gpt4 key购买 nike

我有以下代码

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

我在这里做错了什么吗?谁能解释一下这种行为?

最佳答案

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

但从根本上来说,您根本不应该在第二个线程中使用这样的代码 - 在什么现实生活情况下您希望重复释放和获取锁,而> 在两者之间工作,除了检查标志之外? (如果您确实想要这样做,为什么要要求“关闭”线程获取相同的锁才能设置标志?)

关于java - 为什么下面的代码会导致线程争用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8322452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com