带有类 Reentrant(true) lock 的 Lock 接口的工作方式是它使用BlockingQueue来存储想要获取锁的线程。以这种方式“先来,先出去”的线程-FIFO。都清楚这一点。
但是“不公平锁”到哪里去了,或者 ReentrantLock(false)。他们的内部实现是什么?操作系统如何决定现在选择哪个线程?最重要的是现在这些线程还存储在队列中还是在哪里?(他们一定在某个地方)
我试图让线程池的基础知识非常强大。我了解到它在内部使用阻塞队列来“窃取”任务并将它们运行到池中的给定线程中。这意味着如果我有 10 个任务和 5 个线程,它只能同时运行 5 个任务,直到 1 个任务完全完成。
问题是:为什么不并发?为什么不只是对这 10 个任务进行时间切片?这个实现的原因是什么?
单线程是运行在单核还是单CPU上?
另外,我有i7。它说我有 4 个核心,但有 8 个线程。核心和线程不是1-1的比例吗?怎么翻倍了?
cpu multithreading cpu-architecture hyperthreading cpu-cores
在旧的同步块中,我们使用相同的对象进行同步,还使用了等待和通知方法。所以他们都可以引用同一个锁。说得通。
那么当我使用类 ReentrantLock 时,为什么我不能也使用相同的变量来调用lock、unlock以及await和signal?为什么我需要创建额外的 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 和信号方法?