package com.github.believe3301.nonheapdb.test; import com.github.believe3301.nonheapdb.DBCache; import com.github.believe3301.nonheapdb.Util; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class CacheConcurrentTest extends BasedTest { private Map<String, byte[]> maps; public CacheConcurrentTest(final String name) { super(name); maps = new HashMap<String, byte[]>(); } public void testConcurrent() throws InterruptedException, ExecutionException { final DBCache cache = new DBCache(16, Util.Mb(8), -1); final BasedTest cs = this; Callable<Integer> task = new Callable<Integer>() { public Integer call() { Random ran = new Random(); ran.setSeed(System.currentTimeMillis() ^ System.nanoTime()); for (int i = 0; i < 100000; i++) { int k = ran.nextInt(100000000); String key = cs.generateKey(k); synchronized (maps) { //get if (maps.containsKey(key)) { assertEqualContent(maps.get(key), cache.get(key)); //remove if(k % 5 == 0){ cache.remove(key); maps.remove(key); assertNull(cache.get(key)); } continue; } int vsize = 0; //put if(k % 3 == 0) { vsize = ran.nextInt(256) + 512; } else { vsize = ran.nextInt(256) + 1; } byte[] value = cs.generateTestData(vsize); assertTrue(cache.put(key, value)); maps.put(key, value); //remove if(k % 5 == 0){ cache.remove(key); maps.remove(key); assertNull(cache.get(key)); } } } return 0; } }; List<Callable<Integer>> tasks = Collections.nCopies(10, task); ExecutorService executor = Executors.newFixedThreadPool(10); List<Future<Integer>> futures = executor.invokeAll(tasks); assertEquals(futures.size(), 10); for (Future<Integer> future : futures) { future.get(); } // check data for (String key : maps.keySet()) { byte[] value = cache.get(key); assertNotNull(value); assertEqualContent(maps.get(key), value); } executor.shutdown(); System.out.println(cache.info()); } }