@Test
	public void testMultiThreadWriteTtl_two_million() throws InterruptedException, ExecutionException, IOException {
		final int count = 2 * 1000 * 1000;
		final int threadCount = 16;
		ExecutorService service = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());

		CacheConfig config = new CacheConfig();
		config.setStorageMode(storageMode)
				.setCapacityPerBlock(20 * 1024 * 1024)
				.setMergeInterval(2 * 1000)
				.setPurgeInterval(2 * 1000);
		cache = new BigCache<String>(TEST_DIR, config);

		long start = System.nanoTime();
		List<Future<?>> futures = new ArrayList<Future<?>>();
		for (int i = 0; i < threadCount; i++) {
			final int finalI = i;
			futures.add(service.submit(new Runnable() {

				@Override
				public void run() {
					try {
						final TestSample sample = new TestSample();
						StringBuilder user = new StringBuilder();
						for (int j = finalI; j < count; j += threadCount) {
							sample.intA = j;
							sample.doubleA = j;
							sample.longA = j;
							cache.put(TestSample.users(user, j), sample.toBytes(), 2 * 1000);
						}
						Thread.sleep(10 * 1000);
						for (int j = finalI; j < count; j += threadCount) {
							assertNull(cache.get(TestSample.users(user, j)));
						}
					} catch (IOException e) {
						e.printStackTrace();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}

			}));
		}

		for (Future<?> future : futures) {
			future.get();
		}

		long duration = System.nanoTime() - start;
		System.out.printf("Put/get %,d K operations per second%n",
				(int) (count * 4 * 1e6 / duration));
		service.shutdown();
	}