首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么下面的代码会导致线程争用

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

Stack Overflow用户
提问于 2011-11-30 15:24:04
回答 1查看 131关注 0票数 1

我有以下代码

代码语言:javascript
运行
复制
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次迭代后让位于主线程)

我是不是做错了什么?有人能解释这种行为吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-30 15:30:04

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

但从根本上说,你不应该在第二个线程中有这样的代码-在什么实际情况下,你想重复释放和获取一个锁,在两者之间不做任何工作,除了检查一个标志?(如果您确实想要这样做,为什么要要求“关闭”线程获得相同的锁才能设置标志?)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8322452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档