java - 具有不同超时的嵌套 tryLock 的 ReentrantLock,实际超时是多少?
问题描述
我正在尝试通过两个调用创建一个不公平的缓冲区
- 向缓冲区添加值
- 清空缓冲区
清空队列的线程应该比添加到队列的线程具有更高的优先级。
如果缓冲区已满,我会在内部调用 empty 方法以允许队列清空。
基本思想是添加缓冲区上的锁被限制为addTimeout并且空的锁是emptyAddRatio * addTimeout 所以 add 将具有更高的优先级(假设我有更多的添加然后是空的)。
public class EmptyPriorityBuffer {
private ReentrantLock lock = new ReentrantLock(true);
private long addTimeout = 10;
private long emptyAddRatio = 5;
private int maxSize = 1000;
private LinkedBlockingDeque<Object> buffer = new LinkedBlockingDeque<>(maxSize);
public List<Object> empty() {
try {
lock.tryLock(addTimeout * emptyAddRatio, TimeUnit.MILLISECONDS);
ArrayList<Object> result = new ArrayList<>();
buffer.drainTo(result);
return result;
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
return Collections.emptyList();
}
public void add(Object object) {
try {
lock.tryLock(addTimeout, TimeUnit.MILLISECONDS);
if (!buffer.offer(object)) {
empty();
buffer.offer(object);
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
我的问题:
在缓冲区已满的情况下会发生什么。
当前线程被获取以使用 addtimeout 锁定,现在它要求使用emptyAddRatio * addTimeout的嵌套锁定,女巫比addTimeout大。emptyAddRatio * addTimeout 或addTimeout
之后线程会被中断吗?
解决方案
重入案例中的超时参数不会产生影响,因为您已经拥有锁。也就是说,add
获取锁的调用已经(并且可能必须等待最大addTimeout
毫秒。任何进一步的获取相同锁的尝试都将立即成功。
但是请注意,您需要检查lock.tryLock
两种方法的返回值,empty
并add
确定获取锁是实际成功还是超时。在后一种情况下,您可能想要中止而不是继续。
推荐阅读
- javascript - 为什么两个图标播放相同的音频?
- android - 如何以懒惰的方式加载视图?
- regex - 使用正则表达式的多余“空”匹配
- ios - 删除等宽约束并调整按钮大小
- php - Slim Respect 验证问题
- c# - 更改在 ListBox WindowsForm C# 中选择的颜色行项目
- php - 选择一个选择框空白另一个选择框
- spring - ShinyProxy 和 Google 身份验证错误 404
- ruby-on-rails - Ruby on Rails 应用程序:ElasticSearch 错误“type”=>“cluster_block_exception”
- excel-formula - 第三列单元格应该是excel第一列和第二列中两个数字的乘积