具有不同超时的嵌套 tryLock 的 ReentrantLock,实际超时是多少?
ReentrantLock with nested tryLock with different timeouts, what will be the actual timeout?
我试图通过两次调用创建一个不公平的缓冲区
- 向缓冲区添加值
- 清空缓冲区
清空队列的线程应具有 更高的优先级 添加到队列的线程。
如果缓冲区已满,我会在内部调用 empty 方法以允许队列清空。
基本思想是添加缓冲区的锁限制为 addTimeout 并且空的锁是 emptyAddRatio * addTimeout 所以添加将具有更高的优先级(假设我有更多的添加然后是空的)。
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?
之后线程会被中断吗
re-entrant 情况下的超时参数不会生效,因为您已经拥有锁。也就是说,对 add
的调用已经获得了锁(并且可能不得不等待最多 addTimeout
毫秒。任何进一步尝试获得相同锁的尝试都会立即成功。
但是注意在empty
和add
两种方法中都需要检查lock.tryLock
的return值来判断是真的获取锁成功还是超时.在后一种情况下,您可能想要中止而不是继续。
我试图通过两次调用创建一个不公平的缓冲区
- 向缓冲区添加值
- 清空缓冲区
清空队列的线程应具有 更高的优先级 添加到队列的线程。
如果缓冲区已满,我会在内部调用 empty 方法以允许队列清空。
基本思想是添加缓冲区的锁限制为 addTimeout 并且空的锁是 emptyAddRatio * addTimeout 所以添加将具有更高的优先级(假设我有更多的添加然后是空的)。
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?
re-entrant 情况下的超时参数不会生效,因为您已经拥有锁。也就是说,对 add
的调用已经获得了锁(并且可能不得不等待最多 addTimeout
毫秒。任何进一步尝试获得相同锁的尝试都会立即成功。
但是注意在empty
和add
两种方法中都需要检查lock.tryLock
的return值来判断是真的获取锁成功还是超时.在后一种情况下,您可能想要中止而不是继续。