小编Ana*_*ria的帖子

'fair' 和 'unfair' 锁内部存储的区别

带有类 Reentrant(true) lock 的 Lock 接口的工作方式是它使用BlockingQueue来存储想要获取锁的线程。以这种方式“先来,先出去”的线程-FIFO。都清楚这一点。

但是“不公平锁”到哪里去了,或者 ReentrantLock(false)。他们的内部实现是什么?操作系统如何决定现在选择哪个线程?最重要的是现在这些线程还存储在队列中还是在哪里?(他们一定在某个地方)

java locking reentrantlock

5
推荐指数
1
解决办法
591
查看次数

为什么线程池独立而不是并发地接受任务?

我试图让线程池的基础知识非常强大。我了解到它在内部使用阻塞队列来“窃取”任务并将它们运行到池中的给定线程中。这意味着如果我有 10 个任务和 5 个线程,它只能同时运行 5 个任务,直到 1 个任务完全完成。

问题是:为什么不并发?为什么不只是对这 10 个任务进行时间切片?这个实现的原因是什么?

java multithreading blockingqueue threadpool

1
推荐指数
1
解决办法
85
查看次数

线程是在CPU上运行还是在核心上运行?

单线程是运行在单核还是单CPU上?

另外,我有i7。它说我有 4 个核心,但有 8 个线程。核心和线程不是1-1的比例吗?怎么翻倍了?

cpu multithreading cpu-architecture hyperthreading cpu-cores

0
推荐指数
1
解决办法
1395
查看次数

为什么不能在 ReentrantLock 的对象上直接调用 await 和 signal 方法。为什么我需要条件?

在旧的同步块中,我们使用相同的对象进行同步,还使用了等待通知方法。所以他们都可以引用同一个锁。说得通。

那么当我使用类 ReentrantLock 时,为什么我不能也使用相同的变量来调用lockunlock以及awaitsignal?为什么我需要创建额外的 Condition 变量?

也就是说,为什么我需要这样做:

Lock lock = new ReentrantLock();
    Condition condition = lock.newCondition();

    void doSomething() {
        lock.lock();
            //some code
            condition.await();
            //some code
        lock.unlock();
    }
Run Code Online (Sandbox Code Playgroud)

而不是这样:(这种类型的编码不会更合乎逻辑)?

Lock lock = new ReentrantLock();

    void doSomething() {
        lock.lock();
            //some code
            lock.await();
            //some code
        lock.unlock();
    }
Run Code Online (Sandbox Code Playgroud)

编辑:来自文档:一个 Condition 实例本质上绑定到一个锁。 为什么要这样设计?为什么不只有一个 Lock 类型的变量,它会有 await 和信号方法?

java multithreading locking locks

0
推荐指数
1
解决办法
126
查看次数