我已经稍微提炼了这个问题,消除了我的一些理解,试图让它像 poss 一样简洁和具体,所以它可能看起来很基本
我应该如何使用 AtomicInteger 作为参考计数器来管理某些资源的清理但以安全和原子的方式?
例如:
1)香草示例:
public void close() {
if ((refCt.decrementAndGet()) == 0) {
DBUtil.close(conn);
}
}
这一切都很好, refCt 本身是原子的,但值可能会以关闭资源不会关闭的方式发生变化 - 例如,另一个线程在条件之前减少计数。
使用 var(线程中的堆栈)可以确保在我的线程中维护 refCt,我猜但是
2)矫枉过正(?)示例:
public void close() {
synchronized(lock) {
if ((refCt.decrementAndGet()) == 0) {
DBUtil.close(conn);
}
}
}
我的 refCt 本身是原子的,我对条件(在 AtomicInteger 外部)的测试与保障原子性同步。
3)我是否应该实际使用AtomicInteger
自身来管理条件通过#compareAndSet
并避免阻塞?
public void close() {
for (;;) {
int current = refCt.get();
int refCtDec = current - 1;
if (compareAndSet(current, refCtDec))
DBUtil.close(conn);
}
}
4)这一切是否比应有的复杂/我不能只见树木不见森林吗?