private void createDanglingReleaser(AtomicBoolean released) { try (ReferenceCountingResourceHolder<Closeable> handler = makeReleasingHandler(released)) { handler.increment(); // Releaser not close, the object leaked } }
for (int i = 0; i < 100; i++) { Thread thread = new Thread(() -> { try (Releaser r = resourceHolder.increment()) { try { Thread.sleep(1);
@Override public Void call() { try ( CloseableIterator<Entry<KeyType>> mergedIterator = CloseableIterators.mergeSorted( iterators, keyObjComparator ); // This variable is used to close releaser automatically. @SuppressWarnings("unused") final Releaser releaser = combineBufferHolder.increment() ) { while (mergedIterator.hasNext()) { final Entry<KeyType> next = mergedIterator.next(); settableColumnSelectorFactory.set(next.values); grouper.aggregate(next.key); // grouper always returns ok or throws an exception settableColumnSelectorFactory.set(null); } } catch (IOException e) { throw Throwables.propagate(e); } grouper.finish(); return null; } }
@Override public Void call() { try ( CloseableIterator<Entry<KeyType>> mergedIterator = CloseableIterators.mergeSorted( iterators, keyObjComparator ); // This variable is used to close releaser automatically. @SuppressWarnings("unused") final Releaser releaser = combineBufferHolder.increment() ) { while (mergedIterator.hasNext()) { final Entry<KeyType> next = mergedIterator.next(); settableColumnSelectorFactory.set(next.values); grouper.aggregate(next.key); // grouper always returns ok or throws an exception settableColumnSelectorFactory.set(null); } } catch (IOException e) { throw Throwables.propagate(e); } grouper.finish(); return null; } }