/** @throws Exception Thrown if test failed. */ public void testC() throws Exception { final Collection<SampleBean> set = new GridConcurrentWeakHashSet<>(); int threadCnt = 2; final int cnt = 5; final CountDownLatch start = new CountDownLatch(1); final CountDownLatch stop = new CountDownLatch(threadCnt); Runnable r = new Runnable() { @Override public void run() { try { start.await(); for (int i = 0; i < cnt; i++) { for (int j = 0; j < cnt; j++) set.add(new SampleBean(i)); } } catch (Exception e) { error(e.getMessage()); } stop.countDown(); } }; for (int i = 0; i < threadCnt; i++) new Thread(r).start(); start.countDown(); stop.await(); assert set.size() == cnt; gc(); assert set.isEmpty(); }
/** @throws Exception Thrown if test failed. */ public void testD() throws Exception { final Collection<SampleBean> set = new GridConcurrentWeakHashSet<>(); final int cnt = 100; final CountDownLatch start = new CountDownLatch(1); final CountDownLatch stop = new CountDownLatch(3); new Thread() { @Override public void run() { try { start.await(); for (int i = 0; i < cnt; i++) { for (int j = 0; j < cnt; j++) set.add(new SampleBean(i)); } } catch (Exception e) { error(e.getMessage()); } stop.countDown(); } }.start(); new Thread() { @Override public void run() { try { start.await(); for (int i = 0; i < cnt; i++) { for (int j = 0; j < cnt; j++) set.remove(new SampleBean(i)); } } catch (Exception e) { error(e.getMessage()); } stop.countDown(); } }.start(); new Thread() { @SuppressWarnings({"UnusedDeclaration"}) @Override public void run() { try { start.await(); while (stop.getCount() > 1) { for (SampleBean b : set) { // No-op. } } } catch (Exception e) { error(e.getMessage()); } stop.countDown(); } }.start(); start.countDown(); stop.await(); gc(); assert set.isEmpty(); }