Debezium框架中的这段代码如何解释?
private static final class Sync extends AbstractQueuedSynchronizer {
private static final long serialVersionUID = 4982264981922014374L;
Sync(int count) {
(count);
}
int getCount() {
return getState();
}
@Override
protected int tryAcquireShared(int acquires) {
return (getState() == 0) ? 1 : -1;
}
@Override
protected boolean tryReleaseShared(int releases) {
// Increment or decrement count; signal when transition to zero
for (;;) {
int c = getState();
if (c == 0 && releases >= 0) {
return false;
}
int nextc = c - releases;
if (nextc < 0) {
nextc = 0;
}
if (compareAndSetState(c, nextc)) {
return nextc == 0;
}
}
}
}
问题:
(1)tryAcquireShared方法内部为什么要用getState是否等于零来判断是否获取锁成功?
(2)tryReleaseShared中的代码如何理解
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我没看过
Debezium
的源码哈,不过我看过AbstractQueuedSynchronizer
的一些实现,而且这个代码与CountDownLatch
有点像,所以说大概,给你个参考。getState()
,这个方法是获取状态,这个状态表示锁的重入次数或者一个状态的计数,如ReentrantLock
就是重入一次state
加1,释放一次减1。还有如CountDownLatch
就是创建的时候设置state
,每次countDown
,这个state
就减1,await
把主线程阻塞住,某个线程在countDown
后发现state
等于0,就去释放主线程。return (getState() == 0) ? 1 : -1;
不是用于判断是否获取锁成功的,就是判断state
等不等于0,这就与各自的逻辑相关了。如CountDownLatch
中只用于在await
方法中判断主线程是否需要阻塞。因为调用await
的时候state
可能已经清零,就不用阻塞主线程了。